• 21 搜索二维矩阵 II



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

    • 每行的元素从左到右升序排列
    • 每列的元素从上到下升序排列
      在这里插入图片描述
      在这里插入图片描述

    提示:

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

    题解1 对角线上下循环搜索(超时)

    class Solution {
    public:
        bool searchMatrix(vector<vector<int>>& matrix, int target) {
            const int row = matrix.size();
            const int column = matrix[0].size();
            int km = min(row, column);
            if(1 == row){
                for(int i = 0; i < column; i++){
                    if(target == matrix[0][i])
                        return 1;
                    else if(! i && target < matrix[0][i])
                        return 0;
                }
            }else if(1 == column){
                for(int i = 0; i < row; i++){
                    if(target == matrix[i][0])
                        return 1;
                    else if(! i && target < matrix[i][0])
                        return 0;
                }
            }else{
                for(int i = 0; i < km; i++){
                    if(target == matrix[i][i])
                        return 1;
                    else if(target < matrix[i][i]){
                        if(! i) return 0;
                        else{
                        // 剪枝失败
                            // 搜索空间只有 matrix[
                            // 行
                            for(int k = 0; k < i; k++)
                                for(int l = 0; l < column; l++)
                                    if(target == matrix[k][l])
                                        return 1;
                            // 列
                            for(int k = 0; k < i; k++)
                                for(int l = 0; l < row; l++)
                                    if(target == matrix[l][k])
                                        return 1;
                        }
                    }
                }
            }
            
            return 0;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    生气!!无脑循环都不超时

    在这里插入图片描述

    // 整理思路
    // 应该从第一行最大值开始比较,不要纠结在对角线上
    // 根据数据特点剪枝(缩小搜索空间)
    class Solution {
    public:
        bool searchMatrix(vector<vector<int>>& matrix, int target) {
            const int row = matrix.size();
            const int column = matrix[0].size();
            int i(0), j(column-1);
            while(i < row && j >= 0){
                if(target == matrix[i][j]) 
                    return 1; 
                else if(target > matrix[i][j]) 
                    i ++;
                else j --;
            }
            
            return 0;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    在这里插入图片描述

    题解2 无脑循环

    class Solution {
    public:
        bool searchMatrix(vector<vector<int>>& matrix, int target) {
            for (const auto& row: matrix) {
                for (int element: row) {
                    if (element == target) {
                        return true;
                    }
                }
            }
            return false;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

    题解3 学习STL(二分查找)

    class Solution {
    public:
        bool searchMatrix(vector<vector<int>>& matrix, int target) {
            for (const auto& row: matrix) {
                // 二分查找
                auto it = lower_bound(row.begin(), row.end(), target);
                if (it != row.end() && *it == target) {
                    return true;
                }
            }
            return false;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    在这里插入图片描述

  • 相关阅读:
    【MySQL】一文学会所有MySQL基础知识以及基本面试题
    Mac os 如何安装SVN
    游泳耳机哪个牌子好、分享几款游泳听音乐最好的耳机推荐
    JSP六大动作
    Gmail邮箱注册情况及最新动态
    基于显扬科技自主研发3D机器视觉HY-M5在刹车片检测的应用
    pycharm remote host显示nothing to show
    电力巡检/电力抢修行业解决方案:AI+视频技术助力解决巡检监管难题
    EMC、EMI、EMS的关系
    spring boot在idea中热部署自动更新
  • 原文地址:https://blog.csdn.net/qq_43402798/article/details/132840209