暴力解法
class Solution { public: bool Find(int target, vector<vector<int> > array) { if(array.size()==0)return false; for(int i=0;i<array.size();i++){ int end=array[i].size()-1; if(array[i].size()==0) continue; if(target>array[i][end]) continue; if(target<array[i][0]) return false; //int mid=0; for(int j=0;j<array[0].size();j++){ if(array[i][j]==target) return true; } } return false; } };
注意判空
一维二分查找
class Solution { public: bool Find(int target, vector<vector<int> > array) { if(array.size()==0)return false; for(int i=0;i<array.size();i++){ int end=array[i].size()-1; if(array[i].size()==0) continue; if(target>array[i][end]) continue; if(target<array[i][0]) return false; int l=0,r=end,mid=l+(r-l)/2; while(l<=r){ mid=l+(r-l)/2; if(target>array[i][mid]) l=mid+1; else if(target<array[i][mid]) r=mid-1; if(target==array[i][mid]) return true; } } return false; } };
mid=l+(r-l)/2;是为了防止越界
循环持续条件是l<=r
target大了l=mid+1
小了 r=mid-1
二维二分查找
class Solution { public: bool Find(int target, vector<vector<int> > array) { if(array.size()==0||array[0].size()==0) return false; int m=0; int n=array[0].size()-1; while(m<array.size()&&n>=0){ if(target==array[m][n]) return true; if(target>array[m][n]) m++; else if(target<array[m][n]) n--; } return false; } };
因为二分需要确定状态,朝着一个明确的方向移动,所以需要选择左下角或者右上角作为起点。不管是大还是小都有明确的移动方向。如果选左上角,那target>array时朝着两个方向走都更大,不知道向哪走。