LC-240-搜索二维矩阵 II

77 篇文章 1 订阅
63 篇文章 0 订阅

原题链接:搜索二维矩阵 II

个人解法

思路:

因为每一行每一列都是升序的,故一种直观的方法就是遍历每一行,对每一行进行一个二分搜索。

时间复杂度: O ( n l o g m ) O(nlogm) O(nlogm)

代码:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int n = matrix.size(), m = matrix[0].size();
        for(int i = 0;i < n;i ++) {
            auto &v = matrix[i];
            int l = 0, r = m - 1;
            while(l <= r) {
                int mid = (l + r) >> 1;
                if(v[mid] == target) return true;
                if(v[mid] > target) r = mid - 1;
                if(v[mid] < target) l = mid + 1;
            }
        }
        return false;
    }
};

更好的解法

思路:

我们取右上角的值为起始遍历的点进行比较,为什么取右上角的值?
因为行和列都是升序排列的,那么右上角为它所在行的最大值,为它所在列的最小值
故如果target小于当前值,意味着它所在列的值都比target值大,故可以直接舍弃一列。
如果target大于当前值,意味着它所在行的值都比target小,故可以直接舍弃一行。
这样知道找到target或越界表示没找到。

时间复杂度: O ( n + m ) O(n + m) O(n+m)

代码:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int n = matrix.size(), m = matrix[0].size();
        int x = 0, y = m - 1;
        while(x < n && y >= 0) {
            if(matrix[x][y] == target) return true;
            if(matrix[x][y] < target) x ++;
            else y --;
        }
        return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值