74. 搜索二维矩阵

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

  • 每行中的整数从左到右按升序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

    Solution1:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int j = matrix.size();
for(int i = 0; i < j; i++){
int k = matrix[i].size();
if(k == 0) continue;
if(matrix[i][k-1] == target) return true;
else if(matrix[i][k-1] < target) continue;
return hasNumInArray(matrix[i], target);
}
return false;
}
bool hasNumInArray(vector<int> &a, int num){
int i = 0, j = a.size();
while(i < j){
int mid = (i + j)/2;
if(a[mid] == num) return true;
else if(num > a[mid]){
i = mid+1;
}else{
j = mid;
}
}
return false;

}
};

首先检查每一行的最后一个元素。如果等于直接返回,如果小于目标值,说明不在该行,继续进行下一行的检查。当上一行的最后一个元素比目标值大,当前行最后一个元素比目标值小时,就只在该行进行搜索(二分)。如果能够搜索到则返回true,找不到则说明整个矩阵内没有目标值。

待优化的点: 在进行对每一列的检查时,也可以使用二分来加速范围的选择。