一、题目
二、思路
从左到右,从上到下,两条路径都是数值从小到大排列,为了确定target
是否存在,可以换个起点开始,如从右上角(其实从左下角开始也行),这时候就很神奇了:
- 如果当前值比
target
大,就不能继续往下走(只会越来越大),而往左边走,值会变小,进一步靠近可能的target
; - 如果当前值比
target
小,就不能往左边走了(只会越来越小),而往下面走,值会变大,进一步靠近可能的target
。
另外注意细节,一开始判断matrix
二维数组是否为空,如果为空则matrix.size() == 0
,而此时还matrix[0].size()
取列数是会报错越界的,所以不要先取行数列数再判空。
三、代码
class Solution {
public:
bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
if(matrix.size() == 0 || matrix[0].size() == 0) return false;
int row = matrix.size(), col = matrix[0].size();
//设置初始点在右上角
int i = 0, j = col - 1;
while(i <= row - 1 && j >= 0){
if(matrix[i][j] == target){
return true;
}else if(matrix[i][j] > target){
//往左边走
j--;
}else{
//当前值小于目标值时,不能往左边走了,否则更小
//往下走
i++;
}
}
return false;
}
};