LeetCode 240: 搜索二維矩陣 II - 算法詳解(秒懂系列

文章目錄

  • LeetCode 240: 搜索二維矩陣 II - 算法詳解
    • 題目描述
    • Java解決方案
    • 算法思路
      • 核心理念
      • 為什么選擇右上角?
    • 可視化演示過程
      • 示例1:查找 target = 5
      • 示例2:查找 target = 20 (不存在)
    • 算法分析
      • 時間復雜度
      • 空間復雜度
      • 算法優勢
    • 關鍵要點
    • 擴展思考

LeetCode 240: 搜索二維矩陣 II - 算法詳解

題目描述

編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target。該矩陣具有以下特性:

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

Java解決方案

public class Solution {public boolean searchMatrix(int[][] matrix, int target) {// 從右上角開始搜索int row = 0;int col = matrix[0].length - 1;while (row < matrix.length && col >= 0) {if (matrix[row][col] == target) {return true; // 找到目標值} else if (matrix[row][col] > target) {col--; // 當前值大于目標,向左移動} else {row++; // 當前值小于目標,向下移動}}return false; // 未找到目標值}
}

算法思路

核心理念

利用矩陣的有序特性,從右上角(或左下角)開始搜索,可以在每一步確定性地排除一整行或一整列。

為什么選擇右上角?

  • 右上角特性:當前元素是所在行的最大值,同時是所在列的最小值
  • 決策明確
    • 如果當前值 > target,可以排除整列(向左移動)
    • 如果當前值 < target,可以排除整行(向下移動)

可視化演示過程

示例1:查找 target = 5

初始矩陣:

 1  4  7 11 152  5  8 12 193  6  9 16 22
10 13 14 17 24
18 21 23 26 30

搜索過程演示:

步驟當前位置當前值比較結果操作說明
1(0,4)1515 > 5向左移動排除第4列
2(0,3)1111 > 5向左移動排除第3列
3(0,2)77 > 5向左移動排除第2列
4(0,1)44 < 5向下移動排除第0行
5(1,1)55 = 5找到!返回true

步驟可視化:

步驟1: 從右上角開始

 1  4  7 11 [15] ← 起始位置2  5  8 12  193  6  9 16  22
10 13 14 17  24
18 21 23 26  30

步驟2: 向左移動

 1  4  7 [11] ×   ← 15 > 5, 向左移動2  5  8 12  ×3  6  9 16  ×
10 13 14 17  ×
18 21 23 26  ×

步驟3: 繼續向左移動

 1  4 [7] ×   ×   ← 11 > 5, 向左移動2  5  8  ×   ×3  6  9  ×   ×
10 13 14  ×   ×
18 21 23  ×   ×

步驟4: 再次向左移動

 1 [4] ×  ×   ×   ← 7 > 5, 向左移動2  5  ×  ×   ×3  6  ×  ×   ×
10 13  ×  ×   ×
18 21  ×  ×   ×

步驟5: 向下移動找到目標

 ×  ×  ×  ×   ×   ← 4 < 5, 向下2 [5] ×  ×   ×   ← 找到目標!3  6  ×  ×   ×
10 13  ×  ×   ×
18 21  ×  ×   ×

示例2:查找 target = 20 (不存在)

搜索過程演示:

步驟當前位置當前值比較結果操作說明
1(0,4)1515 < 20向下移動排除第0行
2(1,4)1919 < 20向下移動排除第1行
3(2,4)2222 > 20向左移動排除第4列
4(2,3)1616 < 20向下移動排除第2行
5(3,3)1717 < 20向下移動排除第3行
6(4,3)2626 > 20向左移動排除第3列
7(4,2)2323 > 20向左移動排除第2列
8(4,1)2121 > 20向左移動排除第1列
9(4,0)1818 < 20向下移動越界,未找到

步驟可視化:

步驟1: 從右上角開始

 1  4  7 11 [15] ← 起始位置,15 < 202  5  8 12  193  6  9 16  22
10 13 14 17  24
18 21 23 26  30

步驟2: 向下移動

 ×  ×  ×  ×   ×   ← 排除第0行2  5  8 12 [19] ← 19 < 20,繼續向下3  6  9 16  22
10 13 14 17  24
18 21 23 26  30

步驟3: 繼續向下移動

 ×  ×  ×  ×   ×   ← 排除第0行×  ×  ×  ×   ×   ← 排除第1行  3  6  9 16 [22] ← 22 > 20,向左移動
10 13 14 17  24
18 21 23 26  30

步驟4: 向左移動后向下

 ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ← 排除第2行
10 13 14 [17] ×   ← 17 < 20,向下移動
18 21 23  26  ×

步驟5: 繼續向下移動

 ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ← 排除第3行
18 21 23 [26] ×   ← 26 > 20,向左移動

步驟6-8: 連續向左移動

步驟6:×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   
18 21 [23] ×  ×   ← 23 > 20,向左步驟7:×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   
18 [21] ×  ×  ×   ← 21 > 20,向左步驟8:×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   
[18] ×  ×  ×  ×   ← 18 < 20,向下

步驟9: 嘗試向下移動,越界

 ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ×  ×  ×  ×   ×   ← 所有位置都被排除
[越界] ← row >= matrix.length,搜索結束

最終結果: 返回 false

算法分析

時間復雜度

  • O(m + n) - 其中 m 是行數,n 是列數
  • 最壞情況下需要遍歷一行加一列的長度

空間復雜度

  • O(1) - 只使用常量額外空間

算法優勢

  1. 高效性:時間復雜度優于暴力搜索O(mn)
  2. 簡潔性:代碼邏輯清晰,易于理解
  3. 最優性:這是該問題的最優解法之一

關鍵要點

  1. 起始位置選擇:右上角或左下角都可以,但不能選擇左上角或右下角
  2. 決策準則:利用有序性質,每步都能排除一行或一列
  3. 邊界處理:注意數組越界檢查

擴展思考

  1. 為什么不能從左上角開始?

    • 左上角是行最小值和列最小值,無法確定移動方向
  2. 左下角算法

    int row = matrix.length - 1;
    int col = 0;
    // 大于target向上,小于target向右
    
  3. 其他解法對比

    • 每行二分查找:O(m log n)
    • 暴力搜索:O(mn)
    • 右上角搜索:O(m + n) ? 最優

這個算法充分利用了矩陣的有序性質,是一個經典的"減治"思想的體現。

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

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

相關文章

洛谷 B4071 [GESP202412 五級] 武器強化

思考難度低&#xff0c;但是代碼難度相對較高的題&#xff0c;故做個記錄。首先&#xff0c;題目說了要花費最少的錢&#xff0c;所以我們每次拿最便宜的材料給武器1思想&#xff1a;每次都拿最便宜的材料然后考慮一下這個思想是否正確&#xff0c;找一下反例&#xff0c;每次拿…

SQL工具30年演進史:從Oracle到Navicat、DBeaver,再到Web原生SQLynx

目錄 一、1990s&#xff1a;廠商自帶的數據庫工具時代 二、2000s&#xff1a;Navicat等商業數據庫管理工具崛起 三、2010s&#xff1a;DBeaver等開源SQL工具興起 四、2020s&#xff1a;SQLynx&#xff0c;Web原生數據庫管理工具 五、SQL工具30年時間線對比 六、總結&…

C語言制作掃雷游戲(拓展版賦源碼)

目錄 引言&#xff1a; 三個新功能實現 1.可以選擇難度或自定義 實現難點解析 代碼實現&#xff08;附源碼&#xff09; 掃雷.c game.h game.c 2.對選擇位置進行標記或取消標記 一.框架 我們先理一下思路 如何構造框架 二.取消標記函數 三.標記函數 四.加入清屏&#xff0c;進…

Python快速入門專業版(十):字符串特殊操作:去除空格、判斷類型與編碼轉換

目錄引1.去除空格&#xff1a;清理字符串的實用技巧1.1 三類去空格方法&#xff1a;strip()、lstrip()、rstrip()1.2 實戰案例&#xff1a;處理用戶輸入的空格問題2.判斷類型&#xff1a;驗證字符串內容的特性2.1 常用類型判斷方法2.2 實戰案例&#xff1a;驗證用戶輸入的合法性…

Gamma AI:AI演示文稿制作工具,高效解決PPT框架搭建難與排版耗時問題

你做 PPT 的時候是不是也常陷入 “兩難”&#xff1f;要么對著空白幻燈片發呆&#xff0c;不知道怎么搭框架 —— 比如要做 “產品季度迭代復盤”&#xff0c;既想放數據又想講問題&#xff0c;結果頁面堆得像亂燉&#xff1b;要么好不容易湊完內容&#xff0c;又花兩小時調排版…

【應用案例】AI 給醫用過濾器 “找茬”:3 大難點 + 全流程解決方案

【應用案例】AI 給醫用過濾器 “找茬”&#xff1a;3 大難點 全流程解決方案&#x1f3af;醫用過濾器進行醫療AI檢測&#x1f3af;先看痛點&#xff1a;醫用過濾器檢測難在哪&#xff1f;&#x1f3af;AI檢測方案&#xff1a;3步實現“零漏檢”1. 硬件定制&#xff1a;讓缺陷“…

【數據庫相關】TxSQL新增數據庫節點步驟

TxSQL新增數據庫節點步驟準備工作與注意事項具體操作步驟第 1 步&#xff1a;在主庫上創建復制專用賬號第 2 步&#xff1a;對主庫進行鎖表并獲取二進制日志坐標第 3 步&#xff1a;備份主庫數據并傳輸到新從庫第 4 步&#xff1a;主庫解鎖第 5 步&#xff1a;在新從庫服務器上…

Jmeter快速安裝配置全指南

1、JDK安裝(Java Development Kit) 1.1.JDK下載 JDK下載址&#xff1a; Java Downloads | Oracle &#xff08;jdk-8u211-windows-x64.exe&#xff09; Android 基于 Java 語言開發&#xff0c;所以必須安裝Java環境&#xff0c;Java 環境分JDK 和JRE &#xff0c;JDK提…

設計模式最佳實踐 - 模板模式 + 責任鏈模式

廢話不多說&#xff0c;直接切入正題&#xff0c;本篇要講的是 模板模式 責任鏈模式 實踐。該最佳實踐本身就是一種對 責任鏈模式的增強&#xff0c;模板模式通過 父類 強耦合&#xff0c;預定義好 責任鏈 next 方法 的前后一些切面行為&#xff0c;優雅簡潔。先上示例&#x…

Python快速入門專業版(十一):布爾值與None:Python中的“真假”與“空值”(附邏輯判斷案例)

目錄引言&#xff1a;為什么“真假”與“空值”是編程的核心邏輯1.布爾值&#xff08;bool&#xff09;&#xff1a;Python中的“真”與“假”1.1 布爾值的基礎特性1.2 布爾運算&#xff1a;and、or、not的邏輯規則代碼示例&#xff1a;基礎布爾運算進階特性&#xff1a;短路求…

C++學習知識小結

1. 什么是類&#xff1f;什么是對象&#xff1f;兩者之間什么關系&#xff1f; 類是一類事物的共同特征的抽象描述&#xff0c;它定義這類所有的屬性和方法 可以理解為模版類本身不占用空間&#xff0c;它只是一種定義&#xff0c;描述了對象一個是什么樣子、能做什么 對象是根…

9. Mono項目與Unity的關系

1.Mono項目簡介 2.Mono項目與Unity是如何結合的 3.從Mono到IL2CPP演變過程1.Mono項目簡介 1).定義Mono是一個自由、開源的項目, 由Xamarin現屬于微軟主導開發; 它的目標是創建一個一套兼容于微軟.NET Framework 的跨平臺工具2).核心功能a.C#編譯器能將你寫的C#代碼編譯成IL(中間…

谷歌Genie 3:讓你的照片變成可以玩的游戲世界

你是否曾凝視著一張完美的旅行照片&#xff0c;想象著如果能走進那個畫面&#xff0c;自由探索會是怎樣一種體驗&#xff1f;或者&#xff0c;你是否曾被一幅畫的奇幻氛圍所吸引&#xff0c;渴望能在那片色彩斑斕的世界里奔跑跳躍&#xff1f;過去&#xff0c;這只是白日夢。而…

Cursor 提示詞探索——如何打造真正懂自己的Agent

最近看到魚皮的Cursor提示詞分享&#xff08;微信公眾平臺)&#xff0c;剛好之前也在做Agent開發&#xff0c;跟提示詞打交道的多&#xff0c;也經常發現 ai 蠢蠢的&#xff0c;一點不會根據提示詞設計的來&#xff0c;按魚皮的分享研究了一下&#xff0c;寫了這篇博客。 Curs…

C++ 內存模型:用生活中的例子理解并發編程

C 內存模型&#xff1a;用生活中的例子理解并發編程 文章目錄C 內存模型&#xff1a;用生活中的例子理解并發編程引言&#xff1a;為什么需要內存模型&#xff1f;核心概念&#xff1a;改動序列原子類型&#xff1a;不可分割的操作內存次序&#xff1a;不同的同步級別1. 寬松次…

AI急速搭建網站:Gemini、Bolt或Jules、GitHub、Cloudflare Pages實戰全流程!

文章目錄AI急速搭建網站&#xff1a;Gemini、Bolt或Jules、GitHub、Cloudflare Pages實戰全流程&#xff01;&#x1f680; 極速建站新范式&#xff1a;Gemini、Bolt.new、GitHub & Cloudflare Pages 全流程實戰&#xff01;第一步&#xff1a;創意可視化與代碼生成 — Goo…

Qwen2.5-VL實現本地GPTQ量化

本文不生產技術,只做技術的搬運工!! 前言 公開的Qwen2.5-VL模型雖然功能非常強大,但有時面對專業垂直領域的問題往往會出現一些莫名其妙的回復,這時候大家一版選擇對模型進行微調,而微調后的模型如果直接部署則顯存開銷過大,這時就需要執行量化,下面將介紹執行本地GPT…

【Redis】常用數據結構之Hash篇:從常用命令到使用場景詳解

目錄 1.前言 插播一條消息~ 2.正文 2.1Hash與String對比 2.2常用命令 2.2.1HSET 2.2.2HGET 2.2.3HEXISTS 2.2.4HDEL 2.2.5HKEYS 2.2.6HVALS 2.2.7HGETALL 2.2.8HMGET 2.2.9HLEN 2.2.10HSETNX 2.2.11HINCRBY 2.2.12HINCRBYFLOAT 2.3內部編碼 2.3.1. ziplist&…

OSPF基礎部分知識點

OSPF基礎 前言 路由器 根據 路由表 轉發數據包&#xff0c;路由表項 可通過手動配置 和動態路由協議 生成。&#xff08;兩種生成方式&#xff09;靜態路由比動態路由使用更少的帶寬&#xff0c;并且不占用CPU資源來計算和分析路由更新。當網絡結構比較簡單時&#xff0c;只需配…

Flutter 真 3D 游戲引擎來了,flame_3d 了解一下

在剛剛結束的 FlutterNFriends 大會上&#xff0c;Flame 展示了它們關于 3D 游戲的支持&#xff1a;flame_3d &#xff0c;Flame 是一個以組件系統&#xff08;Flame Component System, FCS&#xff09;、游戲循環、碰撞檢測和輸入處理為核心的 Flutter 游戲框架&#xff0c;而…