搜索二维矩阵 II

搜索二维矩阵 II

思路:我们可以发现,每个任意大小的矩形,都是右下角的元素最大,左上角的元素最小,这就是一个区间。我们可以以这种思路去搜索。把每个要搜的元素跟对角线元素先比较,然后在两个对角线顶点间的矩形中去寻找。

大错特错!这样是区分不开的,也很难找,因为你右下角往左往上移动,martix都变小,没有区分度,何谈寻找?左上角同理:往右往下移动,martix值都变大,没有区分度,谈何寻找?

!!!!!我们把目光放到右上角和左下角就会发现新大陆:

对于右上角元素:往左比他小,往下比他大。

对于左下角元素:往上变小,往右变大,是有区分度的?

这性质像不像二叉搜索树?????

这个题一般是两种方法:

法一:二分查找O(mlogn)

首先先来学习一个C++ algorithm库里的函数:lower_bound

lower_bound 是 C++ 标准模板库(STL)中的一个函数,位于 <algorithm> 头文件中。它是基于二分查找实现的。

功能:lower_bound 用于在一个已排序的范围内查找第一个不小于 给定值的元素。它返回一个迭代器,指向该元素。如果所有元素都小于目标值,则返回 end() 迭代器。

lower_bound 的实现是基于二分查找 算法,因此时间复杂度为**O(log n)** ,其中 n 是范围内的元素数量。由于它要求输入的范围是已排序的,所以可以通过逐步缩小范围来高效地找到目标值的位置。

对每一行使用二分进行查找,看是否在这一行里。(因为该题是每一行升序的有序排列)

代码:

cpp 复制代码
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++)
        {
            auto t=lower_bound(matrix[i].begin(),matrix[i].end(),target);//返回指向该行不小于target的第一个元素的一个迭代器
            if(t!=matrix[i].end()&&*t==target) return true;
        }
        return false;
    }
};

法二:Z字型查找 O(n+m)

这个查找方法就是用我开头说的右上角和左下角的性质。

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int m=matrix.size()-1;
        int n=matrix[0].size()-1;
        int x=0,y=n;
        while(x<=m&&y>=0)//从右上角往左下角搜索,当前值大于目标值 y--,小于目标值则X++;
        {
            if(matrix[x][y]==target)
            {
                return true;
            }
            if(matrix[x][y]>target)
            {
                y--;
            }
            else x++;
        }
        return false;
    }
};

可以看到最坏情况是 要查找的元素在整个矩阵的左下角,这个时候所花时间为(m+n)。故时间复杂度为O(m+n)。

相关推荐
启观川7 小时前
数据结构与算法 -第 3 章 常用算法-动态规划
数据结构·笔记·python·算法
码爸7 小时前
排序算法介绍
python·算法·排序算法
动词ing8 小时前
【题目练习】算法 组合总和||
算法
longlongzihan8 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
专业程序开发源8 小时前
flask家电故障预测系统92491-计算机课程设计/毕业设计
vscode·python·sql·算法·flask·课程设计
Logic1018 小时前
C语言/数据结构欧几里得算法题解:长方形切割最大正方形——贪心划分计数
c语言·数据结构·算法·贪心算法·时间复杂度·空间复杂度·欧几里得算法
yi0119 小时前
LeetCode 643. 子数组最大平均数 I|从暴力枚举到滑动窗口
人工智能·笔记·python·算法·leetcode·滑动窗口
极光通讯9 小时前
服务器内存来料检验(IQC)实操:批次追溯、外观判定与上机验证
java·服务器·算法
淡海水9 小时前
02-04-原理篇-GC Roots与对象图遍历
算法·unity·c#·图·gc·遍历·roots
ClickHouseDB10 小时前
ClickHouse 大规模 OpenTelemetry 数据接入架构的可靠性演进
算法