一开始的超时思路
int row=a.size(),col=a[0].size(); for(int i=0;i<row;i++) { if(a[i][col-1] > target && a[i][0]<=target) { int low=0,high=col-1; while(low<=high) { int mid=(low+high)/2; if (a[i][mid] > target) low = mid-1; else if (a[i][mid] < target) high = mid + 1; else return true; } } } return false;
先判断列上的数,是否大于target,改进后还是超时
int row=a.size(),col=a[0].size(); for(int i=0;i<col;i++) { if(a[0][i]>target) { col=i-1; break; } } if(col == -1) return false; for(int i=0;i<row;i++) { if(a[i][col-1] > target && a[i][0]<=target) { int low=0,high=col-1; while(low<=high) { int mid=(low+high)/2; if (a[i][mid] > target) low = mid-1; else if (a[i][mid] < target) high = mid + 1; else return true; } } } return false;
提示用分治算法,什么是分治?
下面是分治的思路:
从右上角开始查找,为什么我一开始觉得这个思路没有前一个有效率呢?直观上来看 不是很慢吗?
class Solution { public: bool searchMatrix(vector<vector<int>>& a, int target) { int row=a.size(),col=a[0].size(); int i=0,j=col-1; while(i<row && j>=0) { if(a[i][j] > target) j--; else if(a[i][j] < target) i++; else return true; } return false; } };