美文网首页lintcode
28. 搜索二维矩阵

28. 搜索二维矩阵

作者: 和蔼的zhxing | 来源:发表于2017-12-11 17:18 被阅读1次

写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
每行中的整数从左到右是排序的。
每行的第一个数大于上一行的最后一个整数。
样例
考虑下列矩阵:

[[1, 3, 5, 7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
给出 target = 3,返回 true

二分法

二分法是很容易想到的,先找行,再找列。
这种二分查找应该形成自己的一套写法,二维的就降维处理。
就是写得时候一个小地方的变量写错了,造成了死循环,搞了半个小时不知道错在哪里。还是到VS调试了一下才知道是哪里:
这个就是看着复杂,实际上还是很简单的:

  bool searchMatrix(vector<vector<int>> &matrix, int target) {
        int row_sz=matrix.size();
        if(row_sz<1)
        return false;
        int col_sz=matrix[0].size();
        if(target<matrix[0][0]||target>matrix[row_sz-1][col_sz-1])
        return false;
        int high=0;
        int low=row_sz-1;
        int mid;
        while(high<=low)
        {
            mid=high+(low-high)/2;
            if(matrix[mid][0]==target||matrix[mid][col_sz-1]==target)
            return true;
            else if(matrix[mid][0]<target&&matrix[mid][col_sz-1]>target)   //刚好落在这个区间
            {
                break;
            }
            else if(matrix[mid][0]>target)
            {
                low=mid-1;
            }
            else if(matrix[mid][col_sz-1]<target)
            {
                high=mid+1;
            }
        }
        
        int left=0;
        int right=col_sz-1;
        int col_mid;
        while(left<right)
        {
            col_mid=left+(right-left)/2;
            if(matrix[mid][col_mid]==target)
            {
                return true;
            }
            else if(matrix[mid][col_mid]<target)
            {
                left=col_mid+1;      //就是这里,col_mid写成Mid了,导致死循环,气的很
            }
            else if(matrix[mid][col_mid]>target)
            {
                right=col_mid-1;
            }
        }
        return false;
       // write your code here
    }

相关文章

网友评论

    本文标题:28. 搜索二维矩阵

    本文链接:https://www.haomeiwen.com/subject/ekxwixtx.html