LeetCode 74 / 240. Search a 2D Matrix I+II

看起来是2d的问题,但是实际上依旧可以用一维二分的思想来做,无非就是计算横纵坐标而已。

下面用了开区间写法,闭区间写法也是okay的。

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

时间复杂度 O(log(mn))

240. Search a 2D Matrix II

如果沿用二分的思想,只能先纵向二分,再横向二分。如果没找到,继续两个方向二分。

时间复杂度 O(log(n!)),因为最坏情况要做n次二分。

Binary Search Tree Model

将左下角的元素当做类似BST的root。我们只要根据当前元素和target的关系移动,寻找target即可。

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m=matrix.size(), n=m==0?0:matrix[0].size();
        if (m==0 || n==0) return false;
        
        int i=m-1, j=0;
        while (i>=0 && j<n){
            if (matrix[i][j]==target) return true;
            else if (matrix[i][j]<target) ++j;
            else --i;
        }
        return false;
    }
};

时间复杂度 O(m+n)

Divide and Conquer

To be continued ...

猜你喜欢

转载自www.cnblogs.com/hankunyan/p/11582393.html