题目:
写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
- 每行中的整数从左到右是排序的。
- 每行的第一个数大于上一行的最后一个整数。
给定一个值,搜索矩阵,判断该值是否在矩阵中。
样例:
考虑下列矩阵:
[[1, 3, 5, 7],[10, 11, 16, 20],[23, 30, 34, 50]]
给出 target = 3,返回 true
思路:
给定一个数若他比矩阵中的某个数nums[i] [j]大,存在两种情况:这个数要么在nums[i] [j]的右侧,要么在nums[i] [j]的下侧。
给定一个数若他比矩阵中的某个数nums[i] [j]小,存在两种情况: 这个数要么在nums[i] [j]的左侧,要么在numsi的上侧。但是:有种比二分法更清晰的:
左下角为起点(nums[len-1] [0]):那么比较起来比target小的数一定在上面,比target的大的数一定在右边。
右上角为起点(nums[0] [len-1]):那么比较起来比target小的数一定在左边,比target的大的数一定在下面。
参考答案:
class Solution {
public:
/*
* @param matrix: 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
/*求~二维矩阵的行与列
vector<vector<int>> matrix
int row=matrix.size();//行数
int collor=matrix[0].size();//列数
*/
int i = matrix.size()-1;//二维数组的名字代表二维数组第0行的首地址
int j = 0;
//从matrix[matrix.size()-1][0]开始迭代
while (i >=0 && j <matrix[0].size()){
if (target > matrix[i][j]){
j++;
}
else if (target < matrix[i][j]){
i--;
}
else{
return true;
}
}
return false;
}
};
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。