当前位置: 首页 > 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.xdnf.cn/news/1409599.html

相关文章:

  • leetcode-hot-100(堆)
  • 分享一个实用的B站工具箱(支持音视频下载等功能)
  • Conda相关的用法
  • 业务逻辑漏洞类型及防范措施
  • 在实践中学Java(中)面向对象
  • 当 AI 开始 “筛选” 信息:算法偏见会加剧认知鸿沟吗?如何构建公平的 AI 生态?
  • 【算法笔记】算法归纳整理
  • (LeetCode 每日一题) 36. 有效的数独 (数组、哈希表)
  • 基于多模态大模型的PCB智能缺陷检测与分析
  • 人工智能学习:机器学习相关面试题(一)
  • 进程状态 —— Linux内核(Kernel)
  • 【动态规划】回文串问题
  • Wend看源码-marker(RAG工程-PDF文件解析)
  • R notes[2]
  • 鸿蒙Next文本组件全解析:输入框、富文本与属性字符串开发指南
  • Caffeine TimerWheel时间轮 深度解析:O(1)复杂度增删和触发时间事件
  • 李宏毅NLP-13-Vocoder
  • html添加水印
  • 2025年- H103-Lc211--3090. 每个字符最多出现两次的最长子字符串(双指针)--Java版
  • leetcode 268 丢失的数字
  • AG32 Nano开发板的烧录与调试工具(二)
  • 【开题答辩全过程】以 基于vue+springboot的校园疫情管理系统的设计与实现为例,包含答辩的问题和答案
  • 异步编程与面向对象知识总结
  • 家庭全光组网高温故障深度分析与散热重构全记录
  • 【图论】Graph.jl 核心函数
  • 一种使用 Java / Kotlin 编写检测BT种子的磁力链接是否有可用 peers 的程序
  • 扩展:如何设计与实现一个微服务架构下的跨服务异常处理适配器?
  • linux修改权限命令chmod
  • sunset: twilight靶场
  • 利用ms-swift微调和百炼平台微调大模型