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

二分查找专题(十):“Z字形”的降维!当二分查找“失效”时

哈喽各位,我是前端小L。

欢迎来到我们的二分查找专题第十篇!我们手握“万能模板”,正准备大杀四方。面对今天这个“行有序、列有序”的矩阵,我们的第一反应可能是:

  1. “拉平”? [...5], [...6]。不行,65 大,但 [...5, 4] 呢?45 小。它无法拉平成一个完美的一维有序数组。

  2. 对每一行都二分查找? for 循环 m 行,每行 O(log n)。总时间 O(m log n)。

  3. 对每一列都二分查找? for 循环 n 列,每列 O(log m)。总时间 O(n log m)。

这两种 O(n log m) 或 O(m log n) 的解法是可行的,但... 它们足够“高质量”吗?有没有一种更巧妙的、不依赖二分查找的 O(m+n) 解法呢?

有!

力扣 240. 搜索二维矩阵 II

https://leetcode.cn/problems/search-a-2d-matrix-ii/

题目分析:

  • 输入:一个 m x n 矩阵。

  • 属性

    1. 每行从左到右升序。

    2. 每列从上到下升序。

  • 目标:判断 target 是否存在。

“Aha!”时刻:从“角落”出发的“Z字形”搜索

让我们站在矩阵的右上角 (row = 0, col = n-1),把它当作一个“起点”。设当前元素为 current = matrix[row][col]。 我们来和 target 比较:

  • Case 1: current == target

    • 找到了!return true

  • Case 2: current > target

    • currenttarget 大。

    • target 应该在哪里?current 下方的元素都比 current 大(列有序),所以 target 不可能current 下方。

    • target 唯一的可能性,是在 current左侧

    • 决策:向左移动col--

  • Case 3: current < target

    • currenttarget 小。

    • target 应该在哪里?current 左侧的元素都比 current 小(行有序),所以 target 不可能current 左侧。

    • target 唯一的可能性,是在 current下方

    • 决策:向下移动row++

这个过程,就像在矩阵上走一个“Z”字形(或“7”字形)。 每一步,我们都能根据比较结果,明确地排除掉一整行或一整列,从而不断逼近 target,或者走出边界(说明不存在)。

(同理,你也可以从左下角 (row = m-1, col = 0) 开始,current > targetrow--current < targetcol++。)

代码实现 (O(m+n) 巧解)

#include <vector>using namespace std;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;// 2. 循环条件:只要还在矩阵内while (row < m && col >= 0) {int current = matrix[row][col];if (current == target) {return true;} else if (current > target) {// target 必在左方,排除当前列col--;} else { // current < target// target 必在下方,排除当前行row++;}}// 走出了边界,没找到return false;}
};

深度复杂度分析

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

    • 我们的起始点是 (0, n-1),终点是 (m, -1)(-1, n) 之外。

    • 每一步 while 循环,row 指针只增不减(最多 m 步),col 指针只减不增(最多 n 步)。

    • 两个指针移动的总步数之和,最多是 m + n 步。

    • 总时间复杂度 O(m + n)。这比 O(m log n) 或 O(n log m) 都要快!

  • 空间复杂度 O(1)

    • 只使用了 row, col, m, n 等常数个额外变量。

总结:算法的“甄别”与“适配”

今天这道题,是二分查找专题中一个绝佳的“反例”。它深刻地教会我们:

不要被“有序”二字“冲昏头脑”。并非所有“有序”问题,都必须用二分查找。

  • LC 74 (强有序):属性允许“降维”,二分查找是最优解 O(log(mn))。

  • LC 240 (弱有序):属性不允许“降维”,二分查找(O(m log n))不是最优解。反而,一个巧妙的 O(m+n) 线性搜索(Z字形)才是王道。

这体现了算法学习的更高境界:根据问题的具体约束,为它“适配”最恰当的算法

在下一篇中,我们将回归“答案二分”的主线,去解决一个非常经典的“最小化最大值”问题。

下期见!

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

相关文章:

  • 响应式网站源码.net互联网行业的开发网站
  • Windows10 使用 dynv6 + ddns-go 实现 IPv6 固定域名远程访问指南
  • 如何自己做彩票网站免费自动回收的传奇手游
  • 教育培训网站建站网络营销是以什么为中心
  • 专家编程 | 提升编程技能的有效策略
  • 达州科创网站建设公司山东省建设备案网站审批表
  • ui设计的推荐网站及网址本公司经营网站建设
  • 项目分享|SD-Trainer:Stable Diffusion 训练集成工具
  • 专业的无锡网站建设网络贷款公司哪个好
  • Unity使用的编程语言 | 如何选择合适的语言进行高效开发
  • seo整站优化外包哪家好加盟推广公司
  • 《Ionic 滑动框:深度解析与实战指南》
  • 如何编程游戏 | 初学者快速上手游戏开发的技巧与方法
  • 德州建设信息网站wordpress修改默认id号
  • 【大语言模型】-- Prompt Engineering 提示工程
  • 清远市建设工程交易中心网站教育培训网站源码 模板 php培训机构网站源码培训学校网站源码
  • 机器学习实践项目(二)- 房价预测增强篇 - 额外知识
  • 商城建站站长工具seo综合查询引流
  • 百度上面如何做网站网站设计报价单
  • git rebase 合并分支,保持 git history 记录线性、干净、清晰
  • 让人做网站 需要准备什么寿光网站建设m0536
  • AI智能体落地:Agent-Assist vs 全自动化完整决策指南
  • 邱县seo整站排名中国铁建企业门户网站
  • 网络营销网站建设诊断报告福田蒙派克
  • LangChain `OutputParser` 输出 JSON 的核心原理
  • SpingBoot-循环依赖与三级缓存
  • Step-Audio-EditX - 智能音频编辑助手,支持说话音频情感编辑、语音克隆、音频降噪 支持50系显卡 一键整合包下载
  • 浏览器的打印功能,如果通过HTML5,控制样式
  • 无锡手机网站怎样做像绿色和平组织类似的网站
  • 服务端测试面试题集锦