力扣热题100 - 二分查找:搜索二维矩阵 - 如果拿了拼多多 offer 大家会不会选择它呢

拼多多一直以其著名的 高薪 和 996 的工作强度而闻名,对于此种情况,想要工作生活平衡的人可能会更倾向于拿钱更少但是工作强度更低的 offer,想要多挣钱的人可能会选择这种强度更高但是更累的 offer。等等

不知道大家会喜欢哪种呢

今天的题目:

题目描述:

题号:74

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。

  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

图片

解题思路:

思路一:一次二分法(将其视为一维数组)

有一种方法是分别对二个维度进行二次二分查找。

这里简化一下,由于题目给出的是完整的不会有元素缺失的矩阵。

因此,可以将矩阵视为展开的一维有序数组,数组大小为 m * n。对该数组进行一次二分查找即可获得答案。

时间复杂度:O(log n) 

空间复杂度:O(1)

C++

// C++
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m = matrix.size(), n = matrix[0].size();
        // 如果不是完整矩阵的话会出错
        int low = 0, high = m * n - 1;
        while (low <= high) {
            int mid = (high - low) / 2 + low;
            int x = matrix[mid / n][mid % n];
            if (x < target) {
                low = mid + 1;
            } else if (x > target) {
                high = mid - 1;
            } else {
                return true;
            }
        }
        return false;
    }
};

go


// go
func searchMatrix(matrix [][]int, target int) bool {
    m, n := len(matrix), len(matrix[0])
    i := sort.Search(m*n, func(i int) bool { return matrix[i/n][i%n] >= target })
    return i < m*n && matrix[i/n][i%n] == target
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值