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/

posted on 2016-05-06 16:45  summerkiki  阅读(160)  评论(0)    收藏  举报