写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
- 每行中的整数从左到右是排序的。
- 每行的第一个数大于上一行的最后一个整数。
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
输出:
给出 target = 3,返回 true
class Solution {
public:
/**
* @param matrix, a list of lists of integers
* @param target, an integer
* @return a boolean, indicate whether matrix contains target
*/
bool searchMatrix(vector<vector<int> > &matrix, int target) {
// write your code here
int rows = matrix.size();
int cols;
if (rows) {
cols = matrix[0].size();
}
else {
return false;
}
int start = 0;
int end = rows * cols - 1;
while (start + 1 < end) { //这里保证一定会跳出循环
int mid = start + (end - start) / 2; //减少溢出的可能性,相对于 int mid = (start + end) / 2;
if (matrix[mid / cols][mid % cols] == target) {
return true;
}
if (matrix[mid / cols][mid % cols] > target) {
end = mid;
}
else if (matrix[mid / cols][mid % cols] < target) {
start = mid;
}
}
//跳出循环之后一定要对start 和 end 做判断
if (matrix[start / cols][start % cols] == target ||matrix[end / cols][end % cols] == target){
return true;
}
return false;
}
};