劍指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這個數,則
- 6 > 3 我們往上移動行的值;
- 5 > 3 我們往上移動行的值;
- 1 < 3 我們往做移動列的值;
- 2 < 3 我們往做移動列的值;
- 3 = 3 得到目標值
現在我們定義數組的行數爲row,列數爲col,目標值爲target,數組爲array,那麼數組左下角的數爲array[row-1][0]
,則
-
array[row-1] [0] > target 另 array[row-1-1] [0]
1.1 array[row-1-1] [0] < target 另 array[row-1-1] [0+1]
…
-
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;
}