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

leetcode_240 搜索二维矩阵 II

1. 题意

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

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

2. 题解

这个题目和搜索二维矩阵相似。

唯一不同是,

这个题目不保证前一行的末尾元素小于当前行的开头元素了。

因此不能压成一个一维数组进行处理了。

2.1 逐行、列二分

直接逐行、列二分。

逐列二分,时间复杂度O(nlog⁡m)O(n \log m)O(nlogm)

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if (matrix.empty())return false;int R = matrix.size();int C = matrix[0].size();for (int i = 0; i < C; ++i) {int l = 0;int r = R - 1;while ( l <= r ) {int mid = ((r - l) >> 1) + l;int v = matrix[mid][i];if ( v == target )return true;if ( v < target )l = mid + 1;else r = mid - 1;}}return false;}
};

逐行二分,时间复杂度O(mlog⁡n)O(m \log n)O(mlogn)

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if (matrix.empty())return false;int R = matrix.size();int C = matrix[0].size();for (int i = 0; i < R; ++i) {int l = 0;int r = C;while ( l < r ) {int mid = ((r - l) >> 1) + l;int v = matrix[i][mid];if ( v == target )return true;if ( v > target )r = mid;else l = mid + 1;}}return false;}
};

其实我们还可以小小的优化下:

对于最大元素(最右边)小于target的行,我们可以直接舍弃掉。

同样对于最小元素(最左边)大于target的行,我们可以直接舍弃掉。

由于任一列都是有序的,

因此可以二分查找第一个末尾元素不大于target的行ub

同样可以二分查找第一个首元素大于target的行bb

再在[ub,bb)所在范围的这些行进行行二分。

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if (matrix.empty())return false;int n = matrix.size();int R = n;int C = matrix[0].size();int l;int r;l = 0;r = R;while ( l < r) {int mid = ((r - l) >> 1) + l;int v = matrix[mid][C - 1];if ( v == target)return true;if ( v > target)r = mid;elsel = mid + 1;}int ub = r;l = ub;r = R;while ( l < r) {int mid = ((r - l) >> 1) + l;int v = matrix[mid][0];if ( v == target)return true;if ( v > target)r = mid;elsel = mid + 1;}int bb = r;for (int i = ub;i < bb; ++i) {auto it = lower_bound(matrix[i].begin(), matrix[i].end(), target);if (it != matrix[i].end() && *it == target)return true;}return false;}
};
2.2 二叉搜索树

同搜索二维矩阵一样,可以将矩阵看成以右上角为根的二叉搜索树。

图也用上个题目的图吧。

时间复杂度O(n+m)O(n+m)O(n+m)

在这里插入图片描述

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if (matrix.empty())return false;int n = matrix.size();int R = n;int C = matrix[0].size();int x = 0;int y = C - 1;while ( x < R && y >= 0) {int v = matrix[x][y];if ( v == target)return true;if ( v > target)--y;else ++x;}return false;}
};

参考

三叶

http://www.dtcms.com/a/359540.html

相关文章:

  • Windows PostgreSQL JDBC驱动安装包位置
  • 基于开源AI大模型、AI智能名片与S2B2C商城小程序的“教育用户”模式探究
  • C数据结构:排序
  • Knit-易用的prompt管理和调试工具
  • 程序员独立开发直播卖产品 SOP 教程
  • 下载 | Win10正式版最新原版ISO系统映像 (22H2、19045.6282、多合一版本)-系统问题修复
  • Spring Boot 3.0 应用 HTTP 到 HTTPS 技术改造方案
  • AI 相关内容:Agent、MCP、Prompt 与 RAG 入门指南
  • VSCode `tasks.json` 中 `tasks` 数组的详细解析
  • AI 应用 图文 解说 (二) -- 百度智能云 ASR LIM TTS 语音AI助手源码
  • VSCode的launch.json配置文件在C++项目调试中的全面应用
  • React学习教程,从入门到精通, ReactJS - 架构(6)
  • 心路历程-基础命令3
  • 编程与数学 03-004 数据库系统概论 11_数据库的维护
  • OpenCV 图像处理实战与命令行参数配置:从轮廓检测到模板匹配
  • 嵌入式Linux RAMDisk驱动开发
  • 介绍Ansible和实施Ansible PlayBook
  • Linux 特殊文件系统
  • LeetCode每日一题,2025-8-31
  • k8s中 discovery-token和token 的区别
  • COLA:大型语言模型高效微调的革命性框架
  • Python:如何批量下载CLMS NDVI V3数据集?
  • 论文翻译:VSA | Faster Video Diffusion with Trainable Sparse Attention
  • Cesium 入门教程(十四):鼠标键盘交互
  • 【读数笔记】《你的生存本能正在杀死你》
  • 【LeetCode 热题 100】64. 最小路径和——(解法二)递推
  • 需要固定一个指针,再遍历另一个指针的都可以用双指针方法
  • 分布式锁和分布式事务
  • 刷算法题-数组-02
  • Wend看源码-marker(RAG工程-PDF文件解析)