C/C++---------------LeetCode第240. 搜索二维矩阵 II

题目及要求

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

示例 1:

在这里插入图片描述

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true
示例 2:
在这里插入图片描述

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

提示:

m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-109 <= matrix[i][j] <= 109
每行的所有元素从左到右升序排列
每列的所有元素从上到下升序排列
-109 <= target <= 109

暴力查找

思路:直接对比每行每列是否有等于target的数,有的话就返回
这个代码可以用,但是容易超时
时间复杂度为:O(m * n)

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

二分查找解法

思路:对矩阵中的每一行,使用二分查找算法在该行中查找目标值。如果找到了目标值,就返回 true;如果在所有行中都没有找到目标值,则返回 false
时间复杂度为:O(m log n):m 和 n 分别是矩阵的行数和列数
空间复杂度为:O(1)

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

贪心算法

这题用贪心最优的策略:通过判断当前元素与目标值的大小关系,排除一行或一列,从而逐步缩小搜索范围
这种方式比二分查找快很多
时间复杂为:O(m+n)

cclass Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int i = 0, j = matrix[0].size() - 1;
        while(i < matrix.size() && j >= 0) {
            if (target == matrix[i][j]) {
                return true;
            }
            else if (target > matrix[i][j]) {
                i++;
            } else {
                j--;
            }
        }
        return false;
    }
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是念念i

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

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

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

打赏作者

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

抵扣说明:

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

余额充值