劍指offer——第一題

劍指offer——第一題

第一天】打算以後每天做幾道算法題,希望能找到一個好的實習 加油💪

題目】在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

背景知識】二位數組中的查找

思路】算法題嘛,先來看看用暴力能不能解決,再去考慮取巧的問題,剛開始還是一步一步來吧!

思路一】暴力法:既然是一個二維數組,那我就去遍歷它即可,遍歷的時候判斷一下是否含有這個整 數,有的話就返回,沒有的話就繼續,OK,問題迎刃而解,代碼如下:

function Find(target, array) {
    for (let row = 0; row < array.length; row++) {
        for (let col = 0; col < array[row].length; col++) {
            if (array[row][col] == target) {
                return true
            }
        }
    }
    return false
}

思路二】找規律:倘若按照思路一的解法,那麼題目中的很多話就是廢話,現在我們重點就來看那些 被我們忽略掉的話,題目中說每一行都按照從左到右遞增的順序排序,每一列都按照從上到 下遞增的順序排序,我們先自己構建一個這樣的數組:​

1  2  3  4  
5  6  7  8
6  7  8  9

我們可以利用此性質,觀察數組的左上、左下、右上和右下這樣的特殊值,我們會發現右上和左下的這兩個值是有利於我們做一些判斷的,因爲往兩個方向的值要麼比自己大,要麼比自己小,方便做取捨,所以我們優先取這兩個值,這裏我們就取左下的這個值做說明。

假設我們現在查找的是3這個數,則

  1. 6 > 3 我們往上移動行的值;
  2. 5 > 3 我們往上移動行的值;
  3. 1 < 3 我們往做移動列的值;
  4. 2 < 3 我們往做移動列的值;
  5. 3 = 3 得到目標值

現在我們定義數組的行數爲row,列數爲col,目標值爲target,數組爲array,那麼數組左下角的數爲array[row-1][0],則

  1. array[row-1] [0] > target 另 array[row-1-1] [0]

    1.1 array[row-1-1] [0] < target 另 array[row-1-1] [0+1]

  2. array[row-1] [0] < target 另 array[row-1] [0+1]

    2.1 array[row-1] [0+1] > target 另 array[row-1-1] [0+1]

    具體代碼如下:

function Find(target, array) {
   // 定義左下角數組的行的下標
   let row = array.length - 1;
   // 定義左下角數組的列的下標
   let col = 0;
   // 定義數組的列數
   const count = array[0].length;
   // 當檢測值行的下標大於等於0且列的下標小於數組總列數時進循環
   while (row >= 0 && col < count) {
       // 當檢測值等於目標值時 返回真
       if (array[row][col] == target) {
           return true;
       } else if (array[row][col] > target) {
           //當檢測值大於目標值時 檢測值往上移動,即行的下標減一
           row--;
       } else {
           //當檢測值小於目標值時 檢測值往右移動,即列的下標加一
           col++;
       }
   }
   // 退出循環時還未找到目標值返回假
   return false;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章