深入解析二维矩阵搜索:LeetCode 74与240题的两种高效解法对比

news2025/5/10 20:39:05

文章目录

        • **引言**
      • **一、问题背景与排序规则对比**
        • **1. LeetCode 74. 搜索二维矩阵**
        • **2. LeetCode 240. 搜索二维矩阵 II**
      • **二、核心解法对比**
        • **方法1:二分查找法(适用于LeetCode 74)**
        • **方法2:线性缩小搜索范围法(适用于LeetCode 240)**
      • **三、关键差异与适用场景**
      • **四、为什么解法不能互换?**
        • **1. 二分查找法在LeetCode 240中的失效示例**
        • **2. 线性缩小法在LeetCode 74中的效率问题**
      • **五、边界情况处理**
        • **1. 空矩阵或空行**
        • **2. 单元素矩阵**
        • **3. 单行或单列矩阵**
      • **六、总结与建议**


引言

在算法面试中,二维矩阵搜索问题频繁出现,其中 LeetCode 74. 搜索二维矩阵LeetCode 240. 搜索二维矩阵 II 是两道经典的题目。尽管题目名称相似,但它们的矩阵排序规则和解题思路存在显著差异。本文将从问题本质出发,对比两种解法的核心思想、适用场景及实现细节,帮助读者深入理解并灵活应对类似问题。


一、问题背景与排序规则对比

1. LeetCode 74. 搜索二维矩阵
  • 题目描述
    在一个 m x n 的二维矩阵中,每一行元素严格递增,且下一行的第一个元素严格大于上一行的最后一个元素。要求判断目标值 target 是否存在于矩阵中。
  • 排序特性
    整个矩阵可以视为一个全局有序的一维数组,例如:
    [[1, 3, 5, 7],
     [10,11,16,20],
     [23,30,34,60]]
    
    展开后为一维数组:[1,3,5,7,10,11,16,20,23,30,34,60]
2. LeetCode 240. 搜索二维矩阵 II
  • 题目描述
    在一个 m x n 的二维矩阵中,每一行元素从左到右递增,每一列元素从上到下递增,但行与行之间没有严格的大小关系。要求判断目标值是否存在。
  • 排序特性
    矩阵仅局部有序,无法直接展开为全局有序的一维数组,例如:
    [[1, 4, 7],
     [2, 5, 8],
     [3, 6, 9]]
    

二、核心解法对比

方法1:二分查找法(适用于LeetCode 74)
  • 核心思想
    将二维矩阵映射为一维数组,利用二分查找直接定位目标值。

  • 时间复杂度
    (O(\log(m \times n))),其中 (m) 为行数,(n) 为列数。

  • 实现步骤

    1. 将二维索引映射为一维:index = row * n + col
    2. 通过一维索引的二分查找确定目标值的位置。
    3. 转换回二维索引进行值比较。
  • Java代码实现

    class Solution {
        public boolean searchMatrix(int[][] matrix, int target) {
            if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
            int m = matrix.length, n = matrix[0].length;
            int left = 0, right = m * n - 1;
            
            while (left <= right) {
                int mid = left + (right - left) / 2;
                int row = mid / n;  // 计算行坐标
                int col = mid % n;  // 计算列坐标
                
                if (matrix[row][col] == target) {
                    return true;
                } else if (matrix[row][col] < target) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
            return false;
        }
    }
    
方法2:线性缩小搜索范围法(适用于LeetCode 240)
  • 核心思想
    从矩阵的右上角(或左下角)出发,通过逐步排除行或列缩小搜索范围。

  • 时间复杂度
    (O(m + n)),其中 (m) 为行数,(n) 为列数。

  • 实现步骤

    1. 初始化位置为右上角 (0, n-1)
    2. 若当前值等于目标值,返回 true
    3. 若当前值大于目标值,向左移动一列;否则向下移动一行。
    4. 重复直至越界。
  • Java代码实现

    class Solution {
        public boolean searchMatrix(int[][] matrix, int target) {
            if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
            int m = matrix.length, n = matrix[0].length;
            int row = 0, col = n - 1;  // 从右上角开始搜索
            
            while (row < m && col >= 0) {
                int current = matrix[row][col];
                if (current == target) {
                    return true;
                } else if (current > target) {
                    col--;  // 排除当前列
                } else {
                    row++;  // 排除当前行
                }
            }
            return false;
        }
    }
    

三、关键差异与适用场景

对比维度二分查找法(LeetCode 74)线性缩小法(LeetCode 240)
时间复杂度(O(\log(mn)))(对数级,高效)(O(m + n))(线性级,适用于中等规模矩阵)
空间复杂度(O(1))(原地操作)(O(1))(原地操作)
排序规则依赖必须全局有序仅需局部行列有序
适用题目仅LeetCode 74仅LeetCode 240(但LeetCode 74也可用)
优势场景大规模全局有序矩阵局部有序或中等规模矩阵

四、为什么解法不能互换?

1. 二分查找法在LeetCode 240中的失效示例
  • 矩阵示例
    [
      [1, 3, 5],
      [2, 4, 6],
      [7, 8, 9]
    ]
    
  • 搜索目标2
    • 一维展开为 [1,3,5,2,4,6,7,8,9],二分查找时中间值可能跳过实际存在的元素,导致错误结果。
2. 线性缩小法在LeetCode 74中的效率问题
  • 矩阵示例
    [
      [1, 3, 5, 7],
      [10,11,16,20],
      [23,30,34,60]
    ]
    
  • 搜索目标60
    • 从右上角开始需遍历 7 → 20 → 60,时间复杂度为 (O(n)),而二分查找仅需 (O(\log 12) \approx 4) 次比较。

五、边界情况处理

1. 空矩阵或空行
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
2. 单元素矩阵
  • 矩阵为 [[5]],目标值为 5 时直接返回 true
3. 单行或单列矩阵
  • 单行矩阵 [[1,3,5]] 或单列矩阵 [[2],[4],[7]],两种方法均能正确处理。

六、总结与建议

  1. LeetCode 74(全局有序)

    • 优先选择二分查找法,时间复杂度更低,适合大规模数据。
    • 若使用线性缩小法,虽然可行,但效率略低。
  2. LeetCode 240(局部有序)

    • 必须使用线性缩小法,二分查找法因全局无序可能失效。
    • 从右上角或左下角出发均可,逻辑对称。
  3. 实际应用场景

    • 数据库索引查询(全局有序场景)。
    • 图像处理中的局部特征搜索(局部有序场景)。

通过深入理解矩阵的排序规则与算法特性,读者可以灵活选择最优解法,轻松应对二维矩阵搜索问题。无论是面试还是实际工程应用,清晰的思路和高效的代码实现都是解决问题的关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2372598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

迪士尼机器人BD-X 概况

这些机器人代表着迪士尼故事叙述与非凡创新的完美结合。它们不仅栩栩如生&#xff0c;还配备了先进的技术。 -迪士尼幻想工程研发部高级副总裁凯尔劳克林 幕景 BDX 机器人是由华特迪士尼公司的研究和幻想工程部门利用NVIDIA人工智能技术 (AI)开发的现实世界机器人&#xff0c;…

UE5骨骼插槽蓝图

首先在人物骨骼处添加插槽并命名&#xff0c;然后再选择添加预览资产把你要的模型&#xff08;静态网格体&#xff09;放上去。 选择绑定的骨骼再去右边相对位置、旋转等调整物体。 再去人物蓝图里面写就ok了

绘制拖拽html

<!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8" /> <meta name"viewport" content"widthdevice-width, initial-scale1" /> <title>拖拽绘制矩形框 - 可移动可调整大小</ti…

ggplot2 | GO barplot with gene list

1. 效果图 2. 代码 数据是GO的输出结果&#xff0c;本文使用的是 metascape 输出的excel挑选的若干行。 # 1. 读取数据 datread.csv("E:\\research\\scPolyA-seq2\\GO-APA-Timepoint\\test.csv", sep"\t") head(dat)# 2. 选择所需要的列 dat.usedat[, c(…

系统思考:短期困境与长期收益

最近在项目中&#xff0c;一直有学员会提到一个议题&#xff0c;如何平衡当前困境和长期收益&#xff1f; 我的思考是在商业和人生的路上&#xff0c;我们常常听到“鱼和熊掌不可兼得”的说法&#xff0c;似乎短期利益和长期目标注定是对立的。但事实上&#xff0c;鱼与熊掌是…

Cjson格式解析与接入AI大模型

JSON格式的解析与构造 基本概念 JSON是JavaScript Object Notation的简称&#xff0c;中文含义为“JavaScript 对象表示法”&#xff0c;它是一种数据交换的文本格式&#xff0c;而不是一种编程语言。 JSON 是一种轻量级的数据交换格式&#xff0c;采用完全独立于编程语言的…

基于英特尔 RealSense D455 结构光相机实现裂缝尺寸以及深度测量

目录 一&#xff0c;相机参数规格 二&#xff0c;结合YOLO实例分割实现裂缝尺寸以及深度测量 2.1 应用场景 2.2 实现流程 2.3 效果展示 2.4 精度验证 2.5 实物裂缝尺寸以及深度测量效果展示 一&#xff0c;相机参数规格 英特尔 RealSense D455 是英特尔 RealSense D400 系…

Nacos源码—7.Nacos升级gRPC分析四

大纲 5.服务变动时如何通知订阅的客户端 6.微服务实例信息如何同步集群节点 6.微服务实例信息如何同步集群节点 (1)服务端处理服务注册时会发布一个ClientChangedEvent事件 (2)ClientChangedEvent事件的处理源码 (3)集群节点处理数据同步请求的源码 (1)服务端处理服务注册…

TIME - MoE 模型代码 3.2——Time-MoE-main/time_moe/datasets/time_moe_dataset.py

源码&#xff1a;GitHub - Time-MoE/Time-MoE: [ICLR 2025 Spotlight] Official implementation of "Time-MoE: Billion-Scale Time Series Foundation Models with Mixture of Experts" 这段代码定义了一个用于时间序列数据处理的 TimeMoEDataset 类&#xff0c;支…

【某OTA网站】phantom-token 1004

新版1004 phantom-token 请求头中包含phantom-token 定位到 window.signature 熟悉的vmp 和xhs一样 最新环境检测点 最新检测 canvas 下的 toDataURL方法较严 过程中 会用setAttribute给canvas 设置width height 从而使toDataURL返回不同的值 如果写死toDataURL的返回值…

OrangePi Zero 3学习笔记(Android篇)2 - 第一个C程序

目录 1. 创建项目文件夹 2. 创建c/cpp文件 3. 创建Android.mk/Android.bp文件 3.1 Android.mk 3.2 Android.bp 4. 编译 5. adb push 6. 打包到image中 在AOSP里面添加一个C或C程序&#xff0c;这个程序在Android中需要通过shell的方式运行。 1. 创建项目文件夹 首先需…

DeepResearch深度搜索实现方法调研

DeepResearch深度搜索实现方法调研 Deep Research 有三个核心能力 能力一&#xff1a;自主规划解决问题的搜索路径&#xff08;生成子问题&#xff0c;queries&#xff0c;检索&#xff09;能力二&#xff1a;在探索路径时动态调整搜索方向&#xff08;刘亦菲最好的一部电影是…

【论文阅读】基于客户端数据子空间主角度的聚类联邦学习分布相似性高效识别

Efficient distribution similarity identification in clustered federated learning via principal angles between client data subspaces -- 基于客户端数据子空间主角度的聚类联邦学习分布相似性高效识别 论文来源TLDR背景与问题两个子空间之间的主角&#xff08;Principa…

Elasticsearch知识汇总之ElasticSearch部署

五 ElasticSearch部署 部署Elasticsearch&#xff0c;可以在任何 Linux、MacOS 或 Windows 机器上运行 Elasticsearch。在Docker 容器 中运行 Elasticsearch 。使用Elastic Cloud on Kubernetes 设置和管理 Elasticsearch、Kibana、Elastic Agent 以及 Kubernetes 上的 Elasti…

ROBOVERSE:面向可扩展和可泛化机器人学习的统一平台、数据集和基准

25年4月来自UC Berkeley、北大、USC、UMich、UIUC、Stanford、CMU、UCLA 和 北京通用 AI 研究院&#xff08;BIGAI&#xff09;的论文“ROBOVERSE: Towards a Unified Platform, Dataset and Benchmark for Scalable and Generalizable Robot Learning”。 数据扩展和标准化评…

(41)VTK C++开发示例 ---qt使用vtk最小示例

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 本文演示了在Qt中使用VTK的最小示例程序&#xff0c;使用VTK创建显示一个锥体&#xff1b; 采用Cmake作为构建工具&a…

OS7.【Linux】基本指令入门(6)

目录 1.zip和unzip 配置指令 使用 两个名词:打包和压缩 打包 压缩 Linux下的操作演示 压缩和解压缩文件 压缩和解压缩目录 -d选项 2.tar Linux下的打包和压缩方案简介 czf选项 xzf选项 -C选项 tzf选项 3.bc 4.uname 不带选项的uname -a选项 -r选项 -v选项…

国标GB28181视频平台EasyCVR安防系统部署知识:如何解决异地监控集中管理和组网问题

在企业、连锁机构及园区管理等场景中&#xff0c;异地监控集中管控与快速组网需求日益迫切。弱电项目人员和企业管理者亟需整合分散监控资源&#xff0c;实现跨区域统一管理与实时查看。 一、解决方案 案例一&#xff1a;运营商专线方案​ 利用运营商专线&#xff0c;连接各分…

O2O上门服务如何颠覆传统足浴行业?真实案例分析

在湖南经营传统足浴店的张总最近遇到了件让他哭笑不得的事。原本他的门店生意还算稳定&#xff0c;虽然这两年行情不好&#xff0c;但靠着老顾客还能勉强维持。可谁想到&#xff0c;一次好心帮忙&#xff0c;竟让他发现了行业的新天地。 几年前&#xff0c;张总的一位做砂石生意…

金仓数据库永久增量备份技术原理与操作

先用一张图说明一下常见的备份方式 为什么需要永久增量备份 传统的数据库备份方案通常是间隔7天对数据库做一次全量备份&#xff08;完整备份&#xff09;&#xff0c;每天会基于全量备份做一次增量备份&#xff0c;如此循环&#xff0c;这种备份方案在全备数据量过大场景下…