力扣(LeetCode)240. 搜索二维矩阵 II(C++)

题目描述dd
枚举

枚举整个矩阵,找到等于 target 的元素,则 return true ,否则 return false

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int n = matrix.size(), m = matrix[0].size();
        for (auto &x : matrix)
            for (auto &t : x)
                if (t == target) return true;
        return false;
    }
};
  1. 时间复杂度 : O ( n × m ) O(n\times m) O(n×m) n n n 是数组的行数, m m m 是数组的列数,枚举所有元素,时间复杂度 O ( n × m ) O(n\times m) O(n×m)
  2. 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常量级空间 。
二分查找

二分优化枚举。按行枚举矩阵,由于每行元素有序,可以二分查找行内的元素。

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int n = matrix.size(), m = matrix[0].size();
        for (auto &x : matrix) {
            int l = 0, r = m - 1;
            while(l <= r) {
                int mid = l + (r - l >> 1);
                if (x[mid] < target) l = mid + 1;
                else r = mid - 1;
            }
            if (l < m && x[l] == target) return true;
        }
        return false;
    }
};
  1. 时间复杂度 : O ( n l o g m ) O(nlogm) O(nlogm) n n n 是数组的行数, m m m 是数组的列数,一次枚举一行,每行二分查找,时间复杂度 O ( n l o g m ) O(nlogm) O(nlogm)
  2. 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常量级空间 。
枚举行列

更大胆的,同时枚举行列。这是由于每行元素有序,每列元素同样有序。

目的:保证被枚举元素与 target 的大小关系,对应唯一的移动方向

结论:从右上角枚举到左下角,根据右上角元素与 target 的大小关系,确定枚举的移动方向。

证明:右上角元素是一行的最大元素,一列的最小元素。往左下枚举,要找比他小的元素,只能同行往左;要找比他大的元素,只能同列向下。即
右上角元素 > \gt > target,往左;右上角元素 < \lt < target,往下。

朴素错法
  • 为什么从左上角枚举到右下角不行?
    答:左上角元素是一行的最小元素,一列的最小元素。往右下枚举,要找比他大的元素,不能确定往右还是往下。
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int n = matrix.size(), m = matrix[0].size();
        int i = 0, j = m - 1;
        while(i < n && j >= 0) {
            if (matrix[i][j] > target) j --;
            else if (matrix[i][j] < target) i ++;
            else return true;
        }
        return false;
    }
};
  1. 时间复杂度 : O ( n + m ) O(n+m) O(n+m) n n n 是数组的行数, m m m 是数组的列数,一次枚举,移动一列或者一行,时间复杂度 O ( n + m ) O(n+m) O(n+m)
  2. 空间复杂度 : O ( 1 ) O(1) O(1) , 只使用常量级空间 。
AC

按行列枚举,执行结果。

AC

致语
  • 理解思路很重要
  • 读者有问题请留言,清墨看到就会回复的。
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清墨韵染

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值