回覆列表
  • 1 # 一根蒜薹

    1. 弄清楚題目的意思,列出題目的輸入、輸出、約束條件

    其中又一道題目是這樣的:“有一個mxn的矩陣,每一行從左到右是升序的,每一列從上到下是升序的。請實現一個函式,在矩陣中查詢元素elem,找到則返回elem的位置。”題設只說了行和列是升序的,我在草稿紙上畫了一個3x4的矩陣,裡面的元素是1~12,於是我就想當然的認為矩陣的左上角是最小的元素,右下角是最大的元素。於是整個題目的思考方向就錯了。

    2. 思考怎樣讓演算法的時間複雜度儘可能的小

    繼續以上面的題目為例子。可以有如下幾種演算法:

    a. 遍歷整個矩陣進行查詢,那麼複雜度為O(m*n);

    b. 因為每一行是有序的,所以可以對每一行進行二分查詢,複雜度為O(m*logn)。但是這樣只用到了行有序的性質。

    c. 網上查了一下,最優的演算法是從矩陣的左下角開始,比較左下角的元素(假設為X)與elem的大小,如果elem比X大,那麼X所在的那一列元素就都被排除了,因為X是該列中最大的了,比X還大,那麼肯定比X上面的都大;如果elem比X小,那麼X所在的那一行就可以排除了,因為X是這一行裡最小的了,比X還小那麼肯定比X右邊的都小。每迭代一次,矩陣的尺寸就縮小一行或一列。複雜度為O(max(m,n))。

    可以先從複雜度較高的實現方法入手,然後再考慮如何利用題目的特定條件來降低複雜度。

    3. 編寫虛擬碼或程式碼

  • 中秋節和大豐收的關聯?
  • 一代賭王何鴻燊病逝,那位大神能簡單介紹一下?