【LeetCode 熱題 100】240. 搜索二維矩陣 II——排除法

Problem: 240. 搜索二維矩陣 II
編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性:
每行的元素從左到右升序排列。
每列的元素從上到下升序排列。

文章目錄

  • 整體思路
  • 完整代碼
  • 時空復雜度
    • 時間復雜度:O(M + N)
    • 空間復雜度:O(1)

整體思路

這段代碼旨在解決一個經典的矩陣搜索問題:搜索二維矩陣 II (Search a 2D Matrix II)。問題要求在一個特殊的 M x N 矩陣中高效地查找一個目標值 target。這個矩陣的特殊之處在于:

  • 每一行的元素從左到右升序排列。
  • 每一列的元素從上到下升序排列。

該算法采用了一種非常巧妙且高效的 “Z”字形(或稱為“鋸齒形”)查找法。它利用了矩陣的行列雙重有序性,以線性的時間復雜度完成搜索。

  1. 選擇起點

    • 算法的關鍵在于選擇一個合適的起點。它選擇了矩陣的 右上角 (0, n-1) 作為起始搜索點。
    • 為什么是右上角(或左下角):這個位置非常特殊。對于右上角的元素 matrix[i][j]
      • 小于同一行右側的所有元素(不存在)。
      • 大于同一行左側的所有元素。
      • 小于同一列下方的所有元素。
      • 大于同一列上方的所有元素(不存在)。
    • 這種特性使得每一次比較都能排除掉一整行或一整列的元素,從而實現高效的搜索。
  2. 搜索路徑與排除邏輯

    • 算法使用一個 while 循環來持續搜索,只要指針 (i, j) 還在矩陣范圍內(i < m && j >= 0)。
    • 在循環的每一步,將當前指針指向的元素 matrix[i][j]target 進行比較:
      • Case 1: matrix[i][j] == target
        • 找到了目標值,直接返回 true
      • Case 2: matrix[i][j] < target
        • 由于當前元素 matrix[i][j]target 小,并且它已經是當前行 i 中最大的元素(因為我們從最右邊開始),所以 target 不可能在當前行的任何位置。
        • 因此,我們可以安全地排除掉整個第 i,并將搜索范圍向下移動一行。實現方式是 i++
      • Case 3: matrix[i][j] > target
        • 由于當前元素 matrix[i][j]target 大,并且它已經是當前列 j 中最小的元素(因為我們從最上邊開始),所以 target 不可能在當前列的任何位置。
        • 因此,我們可以安全地排除掉整個第 j,并將搜索范圍向左移動一列。實現方式是 j--
  3. 終止條件

    • while 循環會一直持續,直到指針移出矩陣邊界(i 越過下邊界或 j 越過左邊界)。
    • 如果循環結束了還沒有找到 target,就說明目標值在矩陣中不存在,返回 false

這個算法的路徑就像在矩陣中畫一條從右上到左下的折線,每一步都剔除一行或一列,因此效率非常高。

完整代碼

class Solution {/*** 在一個行列都升序的矩陣中高效地查找一個目標值。* @param matrix 一個 M x N 的整數矩陣,每行從左到右升序,每列從上到下升序。* @param target 要查找的目標值。* @return 如果找到目標值則返回 true,否則返回 false。*/public boolean searchMatrix(int[][] matrix, int target) {// 獲取矩陣的行數和列數int m = matrix.length;int n = matrix[0].length;// 步驟 1: 初始化指針,指向矩陣的右上角int i = 0;     // 行指針,從第 0 行開始int j = n - 1; // 列指針,從最后一列開始// 步驟 2: 循環搜索,只要指針還在矩陣范圍內while (i < m && j >= 0) {// Case 1: 找到目標值if (matrix[i][j] == target) {return true;}// Case 2: 當前元素小于目標值// 說明 target 不可能在當前行,因為 matrix[i][j] 是當前行最大的// 排除當前行,向下移動if (matrix[i][j] < target) {i++;} else { // Case 3: 當前元素大于目標值// 說明 target 不可能在當前列,因為 matrix[i][j] 是當前列最小的// 排除當前列,向左移動j--;}}// 步驟 3: 如果循環結束仍未找到,說明目標值不存在return false;}
}

時空復雜度

時間復雜度:O(M + N)

  1. 指針移動分析
    • 算法的核心是兩個指針 ij 的移動。
    • 指針 i 只會單調遞增(向下移動),從 0 最多移動到 m
    • 指針 j 只會單調遞減(向左移動),從 n-1 最多移動到 -1
  2. 循環次數
    • while 循環的每一次迭代中,ij 至少有一個會移動。
    • i 最多移動 M 次,j 最多移動 N 次。
    • 因此,循環的總執行次數最多為 M + N 次。

綜合分析
算法的時間復雜度與行數和列數的和成線性關系,即 O(M + N)

空間復雜度:O(1)

  1. 主要存儲開銷:該算法直接在輸入的 matrix 數組上進行查找,沒有創建任何新的、與輸入規模 MN 成比例的數據結構。
  2. 輔助變量:只使用了 m, n, i, j, target 等幾個常數數量的變量。

綜合分析
算法所需的額外輔助空間是常數級別的。因此,其空間復雜度為 O(1)。這是一個空間效率極高的原地算法。

參考靈神

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/89968.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/89968.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/89968.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android Input 系列專題【inputflinger事件的讀取與分發】

Android輸入系統在native中的核心工作就是&#xff0c;從Linux驅動設備節點中讀取事件&#xff0c;然后將這個事件進行分發&#xff0c;這兩項工作分別交給了InputReader和InputDispatcher來做。 他們的源碼都屬于native層inputflinger里面的一部分&#xff0c;如下架構&#…

【大模型LLM】GPU計算效率評估指標與優化方法:吞吐率

GPU計算效率評估指標與優化方法&#xff1a;吞吐率 一、核心效率指標二、大模型吞吐率&#xff08;Large Model Throughput&#xff09;三、關鍵性能瓶頸分析四、實際測量工具五、優化策略總結 一、核心效率指標 吞吐率&#xff08;Throughput&#xff09; 定義&#xff1a;單位…

Nestjs框架: 集成 Prisma

概述 在 NestJS 的官方文檔中&#xff0c;有兩處對數據庫進行了介紹 第一處位于左側“Techniques&#xff08;技術&#xff09;”部分下的“數據庫”板塊&#xff0c;中文文檔里同樣有這個位置。 Database 第二處是下面的“Recipes (秘籍)”板塊&#xff0c;這里有多個部分都與…

CppCon 2018 學習:What Do We Mean When We Say Nothing At All?

提供的內容深入探討了C編程中的一些關鍵概念&#xff0c;特別是如何編寫清晰、易維護的代碼&#xff0c;并展示了一些C17的新特性。我將對這些內容做中文的解釋和總結。 1. 良好的代碼設計原則 什么是“良好的代碼”&#xff1f; 能工作&#xff1a;代碼實現了預期功能。能在…

C語言中的輸入輸出函數:構建程序交互的基石

在C語言的世界里&#xff0c;輸入輸出&#xff08;I/O&#xff09;操作是程序與用戶或外部數據源進行交互的基本方式。無論是從鍵盤接收用戶輸入&#xff0c;還是將處理結果顯示到屏幕上&#xff0c;亦或是讀寫文件&#xff0c;都離不開C語言提供的輸入輸出函數。本文將深入探討…

高速信號眼圖

橫軸體系時域的抖動大小&#xff1b;縱軸體現電壓的噪聲。 噪聲越大&#xff0c;眼高越小。 抖動越大&#xff0c;眼寬越窄。 眼圖的模板是定義好的最大jitter和噪聲的模板范圍。就是信號的不可觸碰區域。信號波形不能夠觸碰到模板或者進行模板中。也就是眼圖中的線軌跡要在眼…

VisualSVN Server 禁止的特殊符號 導致的。具體分析如下:錯誤提示解讀

是由于 文件夾名稱中包含了 VisualSVN Server 禁止的特殊符號 導致的。具體分析如下&#xff1a; 錯誤提示解讀 錯誤信息明確說明&#xff1a; Folder name cannot contain following symbols < > : " / | and start or end by period. 即 文件夾名稱不能包含以下…

再見,WebSecurityConfigurerAdapter!你好,SecurityFilterChain

對于許多經驗豐富的 Spring開發者來說&#xff0c;WebSecurityConfigurerAdapter 是一個再熟悉不過的名字。在很長一段時間里&#xff0c;它幾乎是所有 Spring Security 配置的起點和核心。然而&#xff0c;隨著 Spring Boot 3.x 和 Spring Security 6.x 的普及&#xff0c;這個…

web前端面試-- MVC、MVP、MVVM 架構模式對比

MVC、MVP、MVVM 架構模式對比 基本概念 這三種都是用于分離用戶界面(UI)與業務邏輯的架構模式&#xff0c;旨在提高代碼的可維護性、可測試性和可擴展性。 1. MVC (Model-View-Controller) 核心結構&#xff1a; Model&#xff1a;數據模型和業務邏輯View&#xff1a;用戶界面展…

【C#】MVVM知識點匯總-2

在C#中實現MVVM&#xff08;Model-View-ViewModel&#xff09;架構時&#xff0c;可以總結以下幾個關鍵知識點&#xff0c;并通過具體的代碼示例來進行說明。 1. 模型 (Model) 模型包含應用程序中的數據和業務邏輯。通常與數據庫交互。 public class User { public int Id {…

一文了解PMI、CSPM、軟考、、IPMA、PeopleCert和華為項目管理認證

1 引言 常見的項目管理方面的認證有PMI、IPMA、PeopleCert、CSPM、軟考和華為項目管理認證6個認證。本篇文章讓你一文了解各認證的基本主要內容。 2 核心定位 目前全球范圍內最具影響力的六大認證體系各有特色&#xff0c;源于不同的管理哲學和實踐背景。六大認證體系的核心…

bean注入的過程中,Property of ‘java.util.ArrayList‘ type cannot be injected by ‘List‘

一、問題 在spring實踐bean注入ArrayList屬性的時候報錯&#xff1a;Property of ‘java.util.ArrayList’ type cannot be injected by ‘List’二、原因分析 在嘗試將 Spring 配置中的 注入到一個 ArrayList 類型的屬性時出現了類型不匹配問題。核心問題在于&#xff1a;Spr…

自注意力機制原理: 向量矩陣案例進行說明

自注意力機制原理: 向量矩陣案例進行說明 目錄 自注意力機制原理: 向量矩陣案例進行說明一個單詞和所有單詞進行乘法運算,提取特征一、場景設定:翻譯句子“我喜歡深度學習”二、向量矩陣構建:以“我”為例計算自注意力三、矩陣視角:批量計算整個序列的自注意力四、向量矩…

D3 面試題100道之(61-80)

這里是D3的面試題,我們從第 61~80題 開始逐條解答。一共100道,陸續發布中。 ?? 面試題(第 61~80 題) 61. D3 中如何繪制餅圖? 使用 d3.pie() 生成角度數據,再結合 d3.arc() 創建路徑。 示例: const data = [10, 20, 30

flutter更改第三方庫pub get的緩存目錄;更改.gradle文件夾存放目錄

1.在目標目錄中新建文件夾flutter_pub_cache 2.在“用戶變量“或“系統變量”中點擊“新建” 變量名: PUB_CACHE 變量值: D:\flutter_pub_cache 3.打開新的終端運行或者從Android studio 控制臺運行&#xff1a;flutter pub cache repair或者flutter pub clean pub讀取新的變…

《Redis》哨兵模式

文章目錄 為什么要有哨兵模式呢&#xff1f;哨兵自動恢復故障主節點使用docker搭建分布式系統查看哨兵節點工作哨兵選舉新的主節點的流程 總結 為什么要有哨兵模式呢&#xff1f; 主從復制的問題 Redis 的主從復制模式可以將主節點的數據改變同步給從節點&#xff0c;這樣從節…

零基礎保姆級本地化部署文心大模型4.5開源系列

近兩年隨著大模型的迅猛崛起&#xff0c;吸引了各行各業的廣泛關注&#xff0c;更對我們的工作方式與生活產生著顯著積極影響。在這樣一個技術范式轉換的關鍵節點&#xff0c;百度文心大模型開源事件無疑具有里程碑意義——它不僅為中國自主研發的AI技術底座打開了通向世界的大…

【筆記】PyCharm 2025.2 EAP 創建 Poetry 和 Hatch 環境的踩坑實錄與反饋

https://youtrack.jetbrains.com/issue/PY-82407/Incorrect-Python-Version-and-Virtual-Environment-Path-When-Creating-Poetry-and-Hatch-Environments-via-GUI-in-PyCharm-2025.2-EAP 在 Python 開發的道路上&#xff0c;PyCharm 一直是我們信賴的開發利器。然而&#xff0…

ASP.NET Web Pages 安裝使用教程

一、ASP.NET Web Pages 簡介 ASP.NET Web Pages 是微軟推出的一種輕量級 Web 開發框架&#xff0c;適合快速開發動態網站。它使用 Razor 語法&#xff0c;可以將 HTML 與 C# 或 VB.NET 無縫融合&#xff0c;特別適合初學者和小型項目。 二、Web Pages 與 MVC 的區別 特性Web …

基于 ethers.js 的區塊鏈事件處理與錢包管理

幣圈工具箱 bqbot.cn 月訪問量達90whttps://bqbot.cn/jms.html &#xff08;在線版地址&#xff09; Event事件 檢索事件 const { ethers } require("hardhat"); async function SearchEvent() {try {const provider new ethers.JsonRpcProvider("http://1…