当前位置: 首页 > news >正文

详细介绍:LeetCode 240. 搜索二维矩阵 II

 题目描述  

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

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

示例

示例 1:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

示例 2:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

解法

1.暴力

class Solution {
public:
bool searchMatrix(vector>& matrix, int target) {
int m = matrix.size(),n = matrix[0].size();
for(int i = 0;i  target) break;
if(matrix[i][j] > target && j == n - 1) return false;
}
}
return false;
}
};
算法思路

        利用矩阵每行都是递增的这一特性,设计一个二层循环,逐行搜索。

时间复杂度:O(NM),空间复杂度:O(1)

2.贪心

解题思路:

        若使用暴力法遍历矩阵 matrix ,则时间复杂度为 O(NM) 。暴力法未利用矩阵 “从上到下递增、从左到右递增” 的特点,显然不是最优解法。

如下图所示,我们将矩阵逆时针旋转 45° ,并将其转化为图形式,发现其类似于 二叉搜索树 ,即对于每个元素,其左分支元素更小、右分支元素更大。因此,通过从 “根节点” 开始搜索,遇到比 target 大的元素就向左,反之向右,即可找到目标值 target 。

        “根节点” 对应的是矩阵的 “左下角” 和 “右上角” 元素,本文称之为 标志数 ,以 matrix 中的 左下角元素 为标志数 flag ,则有:

        若 flag > target ,则 target 一定在 flag 所在 行的上方 ,即 flag 所在行可被消去。
        若 flag < target ,则 target 一定在 flag 所在 列的右方 ,即 flag 所在列可被消去。

class Solution {
public:
bool searchMatrix(vector>& matrix, int target) {
int i = matrix.size() - 1, j = 0;
while(i >= 0 && j  target) i--;
else if(matrix[i][j] < target) j++;
else return true;
}
return false;
}
};
算法流程

1.从矩阵 matrix 左下角元素(索引设为 (i, j) )开始遍历,并与目标值对比:

· 当 matrix[i][j] > target 时,执行 i-- ,即消去第 i 行元素。

· 当 matrix[i][j] < target 时,执行 j++ ,即消去第 j 列元素。

    · 当 matrix[i][j] = target 时,返回 true ,代表找到目标值。

2.若行索引或列索引越界,则代表矩阵中无目标值,返回 false 。

时间复杂度:O(M+N),空间复杂度:O(1)

http://www.gsyq.cn/news/10698.html

相关文章:

  • 飞书 燕千云焕新上线,飞书用户即刻试用ITSM工具
  • 如果使用微软 Azure 托管的 OpenAI 服务
  • Alibaba Cloud Linux与 RHEL/CentOS版本对应关系 - 实践
  • OpenCV:人脸识别实战,3 种算法(LBPH/EigenFaces/FisherFaces)代码详解 - 实践
  • 深入解析:Playwright录制时的高亮实现机制分析
  • 什么是文件外发审批?主要有哪几种关键流程?
  • Python入门—Mac如何搭建Python开发环境?
  • 跨网文件摆渡软件:企业数据安全高效传输的关键解决方案!
  • 一文详解纷享销客CRM Agent平台3大核心能力(附应用场景与案例)
  • QOJ #5076. Prof. Pang and Ants 题解
  • 微信小程序(uniapp)PDF预览完整实现方案
  • nuxt3中使用pdfjs-dist实现pdf转换canvas实现浏览
  • 【SpringBoot- Spring】学习
  • css-更改鼠标样式
  • css-图片文字对齐方式
  • css-文字溢出省略号显示
  • 深入解析:mosquitto求医之路(3):Docker安装也不好使
  • 开源语音识别FunASR入门详解
  • ruoyi-vue(十四)——前端框架及package.json,vite.config.js, main.js记录介绍
  • AT_arc172_d [ARC172D] Distance Ranking
  • 【读书笔记】《深入理解计算机系统(原书第三版)》第一章 计算机系统漫游
  • 如何将PPT每一页批量导出为高清JPG图片?一文讲清处理流程
  • 实用指南:计算机视觉:基于YOLOv11 实例分割与OpenCV 在 Java 中的实现图像实例分割
  • iframe引入界面有el-date-picker日期框,点击出现闪退问题处理 - 详解
  • 阿德勒的课题分离是很好用的东西
  • macos ld: unsupported tapi file type !tapi-tbd in YAML file 问题解决
  • 【GitHub每日速递 250924】18 个 AI 投资大师齐上阵!这个开源对冲基金让你看透市场底牌
  • 2025年国家科技奖初评公布(科技进步奖)
  • 2025年国家科技奖初评公布(科技发明奖)
  • 2025年国家科技奖初评公布(自然科学奖)