• 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

    在这里插入图片描述

  • 相关阅读:
    02 栈的原理与使用
    [算法日志]图论刷题 沉岛思想的运用
    网络术语介绍 服务器、中间件、数据库、代码、静态资源 客户端,服务器,IP地址,域名,DNS,ISP,TCP/IP,HTTP
    openssl漏洞检查修复
    如何快速实现直播美颜功能 - 接入美颜SDK详解
    重学 vue3 中的 computed
    git 删除远程标签tag【杂记】
    【笔记】数仓分层
    MATLAB中scatter3函数用法
    [附源码]Python计算机毕业设计Django工程施工多层级管理架构
  • 原文地址:https://blog.csdn.net/qq_43402798/article/details/132840209