劍指 offer 04. 二維陣列中的查詢
在乙個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個高效的函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
示例:現有矩陣 matrix 如下:
[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]
給定 target = 5,返回 true。
給定 target = 20,返回 false。
限制:0 <= n <= 1000
0 <= m <= 1000
這個題一時沒想到什麼妙方法,感覺暴力法是可行的:
遍歷二維陣列中的每乙個一維陣列,
如果i < 目標值target,則i++;
如果i = target,則返回true;
如果i > target,則說明後面的都大於目標值,不需要比較,直接進入下乙個陣列
class
solution
else
if(matrix[i]
[j]> target)}}
return
false;}
}
時間複雜度:o(n*m)
空間複雜度:o(1)
上述**沒有利用到列也是遞增的這個資訊,因此,**還可以優化下。
充分利用列遞增的資訊:如果matrix[i][0] > target,則後面不需要再做比較,直接返回false
class
solution
if(matrix[i]
[j]== target)
else
if(matrix[i]
[j]> target)}}
return
false;}
}
書上的思路是:從右上角開始
首先,選取陣列中右上角的數字,如果該數字等於要查詢的數字,則查詢過程結束;
如果該數字大於要查詢的數字,則剔除這個數字所在的列;
如果該數字小於要查詢的數字,則剔除這個數字所在的行;
這樣,每一步都在陣列的查詢範圍中剔除一行或一列,每一步都可以縮小查詢範圍,直到找到要查詢的數字,或者查詢範圍為空。
class
solution
else
if(matrix[i]
[j]> target)
else
if(matrix[i]
[j]< target)}}
return
false;}
}
時間複雜度:
由於每次都能去掉一行或一列,最壞時間複雜度為:o(n + m)
空間複雜度:o(1)
劍指offer04 二維陣列查詢
在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。測試示例 矩陣 matrix 如下 begin 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 ...
劍指Offer04 二維陣列中的查詢
在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個高效的函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。現有矩陣 matrix 如下 1,4,7,11,15 2,5,8,12,19 3,6,9,16,22 10,13,1...
劍指 Offer 04 二維陣列中的查詢
在乙個 n m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。遍歷陣列 時間複雜度 o nm 空間複雜度o 1 從二維陣列的右上角開始查詢。如果當前元素等於目標值,則返回 true。如...