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 == matrix[i].length

1 <= m, n <= 100

-104 <= matrix[i][j], 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) 仅用常数变量

相关推荐
木井巳1 天前
【递归算法】组合总和
java·算法·leetcode·决策树·深度优先·剪枝
coding者在努力1 天前
被n整除的n位数
c++·算法
赵药师1 天前
Win11下的VS2022 配置RGBD435i 相机
c++·vs2022·windows11·rgbd435i
量子炒饭大师1 天前
【C++ 进阶】Cyber霓虹掩体下的代码拟态——【面向对象编程 之 多态】一文带你搞懂C++面向对象编程中的三要素之一————多态!
开发语言·c++·多态
伴我与影1 天前
【记录】复现论文 Dftpav
c++·docker
Hical_W1 天前
深入学习CPP17_PMR
c++·学习
计算机安禾1 天前
【数据结构与算法】第42篇:并查集(Disjoint Set Union)
c语言·数据结构·c++·算法·链表·排序算法·深度优先
吃着火锅x唱着歌1 天前
LeetCode 150.逆波兰表达式求值
linux·算法·leetcode
阿Y加油吧1 天前
两道中等 DP 题拆解:打家劫舍 & 完全平方数
算法·leetcode·动态规划
苕皮蓝牙土豆1 天前
Qt图形视图框架入门:坐标系统与鼠标事件处理详解
c++·qt