74. 搜索二维矩阵

文章目录

题目

二分查找:74. 搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。

每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

示例 1:

输入:matrix = \[1,3,5,7,10,11,16,20,23,30,34,60], target = 3

输出:true

示例 2:

输入:matrix = \[1,3,5,7,10,11,16,20,23,30,34,60], target = 13

输出:false

提示:

m == matrix.length

n == matrixi.length

1 <= m, n <= 100

-104 <= matrixij, target <= 104

代码

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        //判断矩阵是否为空
        if(matrix.empty()||matrix[0].empty()){
            return false;
        }
        //数组的行和列
        int m=matrix.size();
        int n=matrix[0].size();
        //二份查找的两个位置
        int left=0;
        int right=m*n-1;
        while(left<=right){
            int mid=left+(right-left)/2;
            //在数组中的映射关系
            int row=mid/n;
            int col=mid%n;
            //如果与目标值相等直接返回true
            if(matrix[row][col]==target){
                return true;
            }else if(matrix[row][col]<target){//如果目标值在中间值的右边,则左边界为mid+1
                left=mid+1;
            }else{//如果目标值在中间值的左边,则右边界为mid-1
                right=mid-1;
            }
        }
        return false;
    }
};

原理图

原理解释

提示:算法流程及解释在代码中已标注

在不使用额外矩阵的情况下,在原有的矩阵上进行二分查找

涉及到元素在二维数组中和元素在一维数组中的映射关系

以一维数组为例:

i为一维数组下标,n为二维数组的列

row=i/n;

col=i%n;

时间复杂度:O (log (m*n)) 二分查找

空间复杂度:O (1) 仅用常数变量

相关推荐
Tisfy几秒前
LeetCode 3300.替换为数位和以后的最小元素:一次遍历
数学·算法·leetcode·模拟
elseif12329 分钟前
【C++】vector 详细版
开发语言·c++·算法
cany10001 小时前
C++ -- 原子变量
c++
2601_957888561 小时前
从数据隔离到全链路分发:短视频矩阵系统的防关联底层逻辑与提效实践
线性代数·矩阵
cany10001 小时前
C++ -- 队列std::queue
开发语言·c++
周末也要写八哥2 小时前
C++中单线程方式之无脑上锁
java·开发语言·c++
cany10002 小时前
C++ -- 动态内存分配和释放(new/delete)
开发语言·c++
_Evan_Yao2 小时前
线性代数 + 编程:用Python实现向量和矩阵运算
python·线性代数·矩阵
xcyxiner2 小时前
ubuntu下 cmake初始化脚本 以及 qt依赖
c++·qt
周末也要写八哥2 小时前
Visual C++6.0下载安装流程及PDF学习手册资源
c++·学习·pdf