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

Leetcode力扣解题记录--第240题(矩阵搜索)

题目链接:240. 搜索二维矩阵 II - 力扣(LeetCode)

题目描述

编写一个高效的算法来搜索 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

题目作答

解决这个问题的核心思想是利用矩阵的结构特性,逐步缩小搜索范围。一个低效的方法是逐行进行二分查找,时间复杂度为 O(m log n),但这并未完全利用“列也排序”的特性。

最高效的算法是“Z”字形或“马鞍点”查找法。该方法的巧妙之处在于选择一个合适的起点,使得每一步比较后都能明确地排除一行或一列,从而将搜索空间线性地减小。

这个理想的起点是矩阵的右上角(或者左下角也可以)。为什么是右上角呢?

  1. 选择起点:我们将搜索指针初始化在矩阵的右上角,即 (row = 0, col = n - 1)。

  2. 比较与移动

    • 令当前元素为 current = matrix[row][col]。

    • 如果 current == target:恭喜,我们找到了目标值,直接返回 true。

    • 如果 current > target:因为当前行的元素从左到右是递增的,所以 target 不可能在 current 的右边。同时,因为当前列的元素从上到下是递增的,所以 target 也不可能在 current 的下方(下方的元素都比current大)。因此,唯一可能的位置是在 current 的左边。我们可以安全地排除当前所在的整列,将指针向左移动一位,即 col--。

    • 如果 current < target:因为当前列的元素从上到下是递增的,所以 target 不可能在 current 的上方。同时,因为当前行的元素从左到右是递增的,所以 target 也不可能在 current 的左边(左边的元素都比current小)。因此,唯一可能的位置是在 current 的下方。我们可以安全地排除当前所在的整行,将指针向下移动一位,即 row++。

  3. 终止条件:我们重复上述比较和移动的过程,直到找到 target,或者指针移出了矩阵的边界(row 超出下边界或 col 超出左边界)。如果循环结束仍未找到,说明矩阵中不存在该目标值。

这个算法在每一步都稳定地排除一行或一列,其路径最多走 m + n 步,因此时间复杂度为 O(m + n),空间复杂度为 O(1),非常高效。

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();// 1. 从矩阵的右上角开始搜索int row = 0;int col = n - 1;// 循环条件:指针在矩阵边界内while (row < m && col >= 0) {int current = matrix[row][col];if (current == target) {// 2. 找到了目标值return true;} else if (current > target) {// 3. 当前值大于目标值,排除当前列,向左移动col--;} else { // current < target// 4. 当前值小于目标值,排除当前行,向下移动row++;}}// 如果循环结束仍未找到,说明目标值不存在return false;}
};

http://www.lryc.cn/news/596930.html

相关文章:

  • 大规模金融数据相关性并行计算系统设计与实现
  • Linux内存映射原理
  • 第十讲:stack、queue、priority_queue以及deque
  • Python-初学openCV——图像预处理(一)
  • 如何在 npm 上发布 Element Plus 二次封装组件
  • Parasoft为金融服务打造统一测试平台,提升安全、合规与交付效率
  • C++ Primer(第5版)- Chapter 7. Classes -005
  • ESP32的ADF详解:6. Audio Processing的API
  • Android 测试全指南:单元测试与UI测试框架详解
  • ESP-NOW实战:ESP32一对多无线通信方案(支持ESP8266兼容)
  • 【Spring Cloud Gateway 实战系列】进阶篇:过滤器高级用法、动态路由配置与性能优化
  • Android Studio中调用USB摄像头
  • CRMEB 单商户PRO多商户通用去版权教程
  • win11安装erlang和rabbitmq
  • SpringBoot 使用Rabbitmq
  • RabbitMQ--@RabbitListener及@RabbitHandle
  • OceanBase数据库
  • RabbitMQ有多少种Exchange?
  • LLM 幻觉一般是由于什么产生的,在模型什么部位产生
  • Java学习第六十九部分——RabbitMQ
  • iOS WebView 远程调试实战 解决表单输入被键盘遮挡和焦点丢失问题
  • 期权遇到股票分红会调整价格吗?
  • 【机器学习深度学习】比较 LLaMA-Factory、vLLM 和 LMDeploy 的量化导出:为何 LLaMA-Factory 不是首选?
  • OpenCV(01)基本图像操作、绘制,读取视频
  • Redis MCP 安装与配置完整指南
  • Spring Boot全局异常处理:一网打尽Controller层异常,@RestControllerAdvice解析
  • Unreal5从入门到精通之使用 Python 编写虚幻编辑器脚本
  • Linux进程控制:掌握系统的核心脉络
  • 《设计模式之禅》笔记摘录 - 9.责任链模式
  • Xorg占用显卡内存问题和编译opencv GPU版本