劍指offer(4)
阿新 • • 發佈:2022-04-22
劍指offer(4)
劍指 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
思路:
對每一行都判斷target是不是在範圍內,如果在這一行的範圍內,使用二分查詢。但是這樣要提前判斷matrix的陣列大小是否是0。記憶體消耗大,但是時間少
class Solution { public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { if(matrix.size()==0)return false; if(matrix[0].size()==0)return false; int ll=0; int hh=matrix[0].size()-1; for(int i=0;i<matrix.size();i++){ if(target<=matrix[i][hh]&&target>=matrix[i][ll]){ if(binarySearch(matrix[i],target)) return true; } } return false; } bool binarySearch(vector<int> matrix,int target){ int lo=0; int hi=matrix.size()-1; while(lo<=hi){ int mid=lo+(hi-lo)/2; if(matrix[mid]==target)return true; else if(matrix[mid]>target)hi--; else lo++; } return false; } };
思路2:從二維陣列的右上角開始遍歷。如果比目標值大就向左走,小了就向下走。這樣最優秀,記憶體和時間複雜度都比較優秀
class Solution { public: bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) { /* 判斷陣列不為空 */ if(matrix.size() == 0 || matrix[0].size() == 0) return false; int row = 0; int column = matrix[0].size() - 1; while (row < matrix.size() && column >= 0) { /* 獲取當前元素 */ int num = matrix[row][column]; /* 遍歷陣列 */ if (num == target) { return true; } else if (num > target) { column--; } else { row++; } } return false; } };