Search a 2D Matrix

每一行为升序排序,且下一行的第一个数字大于上一行的最后一个数字,则可以把二维数组转化为一维数组来处理。该一维数组为升序排序,在一个升序排序的数组中查找一个数,最方便的方法就是二分查找。
在这里要知道,如何把一维数组的坐标转化为二维数组的坐标。
设一个二维数组是m*n,则它一共有m*n个元素:
则二维数组中a[i][j]在一维数组的坐标为b[i*n+j],一维数组中b[t]在二维数组中的坐标为a[t/n][t%n]。
bool searchMatrix(vector<vector<int>>& matrix, int target) { bool result=false; if(matrix.size()==0) return result; int m=matrix.size(); int n=matrix[0].size(); int l=0,r=m*n-1; while(l<=r) { int mid=(l+r)/2; int x=matrix[mid/n][mid%n]; if(target==x) { result=true; break; } else if(target<x) r=mid-1; else l=mid+1; } return result; }
由于这里只要判断数组中有没有出现这个数字即可,因此我在找到的时候直接break跳出了循环。如果需要找到所有满足的情况,代码还要做一些修改。
在二分查找中,如果指针变化的方式是l=mid+1;r=mid-1;则循环终止的条件就是l<=r。
二分查找的时间复杂度是O(logN)。
可以参考博客:http://blog.csdn.net/int64ago/article/details/7425727/
浙公网安备 33010602011771号