矩阵上折半查找

class Solution {
2
public:
3
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
4
        // 先折半定位第几行, 在折半定位第几行
5
        if(matrix.size() == 0)  return false;
6
        int ymax=matrix.size(), xmax=matrix[0].size();
7
        if(xmax==0 ) return false;
8
        vector<int> firstcol(ymax);
9
        for(int j=0;j<ymax;j++){
10
            firstcol[j] = matrix[j][0];
11
        }
12
        int row=BinSearch(firstcol, 0, ymax-1, target);
13
        int col=BinSearch(matrix[row], 0, xmax-1, target);
14
        return matrix[row][col]==target;
15
​
16
    }
17
​
18
    int BinSearch(vector<int> a, int low, int high, int val){// 若找到则返回相应位置,没找到就是比待查元素小一点的位置
19
        while(low<high){
20
            int mid=(low+high)/2;
21
            if(a[mid] == val )  return mid;
22
            else if(a[mid] > val) high=mid-1;
23
            else    low=mid+1;
24
        }
25
        if(low==0) return low;
26
        else return a[low] <= val ? low : low-1;
27
    }
28
};

更为简单直接的方法:把整个矩阵看成一个线性表,但是复杂度O(log(mn))

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if(matrix.empty() || matrix[0].empty()) return false;
        int xmax=matrix[0].size(), ymax=matrix.size();
        int low=0, high=xmax*ymax-1;
        while(low<high){
            int mid = (low+high)/2;
            int e = matrix[mid/xmax][mid%xmax];
            if(e == target) return true;
            else if(e > target) high=mid-1;
            else low = mid+1;
        }
        return matrix[low/xmax][high/xmax]==target;
    }
};

猜你喜欢

转载自blog.csdn.net/futangxiang4793/article/details/84138016