28. 搜索二维矩阵二分法

2018-09-04 13:05:45 浏览数 (1)

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

代码语言:javascript复制
[[1, 3, 5, 7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]
给出 target = 3,返回 true

二分法

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

代码语言:javascript复制
  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
    }

0 人点赞