一、题目
二、思路
从左到右,从上到下,两条路径都是数值从小到大排列,为了确定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; } };