搜索二維矩陣 - LeetCode 熱題 64

大家好!我是曾續緣🧡

今天是《LeetCode 熱題 100》系列

發車第 64 天

二分查找第 2 題

??點贊 👍 收藏 ?再看,養成習慣

搜索二維矩陣

給你一個滿足下述兩條屬性的 m x n 整數矩陣:

  • 每行中的整數從左到右按非嚴格遞增順序排列。
  • 每行的第一個整數大于前一行的最后一個整數。

給你一個整數 target ,如果 target 在矩陣中,返回 true ;否則,返回 false

示例 1:

輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
輸出:true

示例 2:

輸入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
輸出:false

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104
難度:💖💖

解題方法

首先,我們需要明確題目中矩陣的兩個特性:每一行從左到右遞增,每一行的第一個數比上一行的最后一個數大。這意味著整個矩陣在某種意義上是“排序”的,我們可以利用這一點來快速定位元素。
在解決這個問題時,我們可以把矩陣看作一個一維數組,然后使用二分查找算法。如何把二維矩陣映射到一維數組呢?考慮到矩陣有 m 行 n 列,我們可以將矩陣的行優先展開,即先放置第一行的所有元素,然后是第二行,依此類推。這樣,矩陣中的元素 matrix[i][j] 將會映射到一維數組中的位置 i * n + j
接下來,我們可以在這個假想的一維數組上使用二分查找。二分查找的基本思想是在有序數組中通過重復將搜索區間減半來定位目標值。具體步驟如下:

  1. 確定搜索范圍的最小和最大索引,初始時最小索引 l0,最大索引 rm * n - 1(即矩陣中最后一個元素的索引)。
  2. 計算中間索引 mid = (l + r) / 2,然后找到這個索引對應的矩陣中的元素 matrix[mid / n][mid % n]
  3. 比較這個元素與目標值 target
    • 如果相等,說明找到了目標值,返回 true
    • 如果小于目標值,說明目標值應該位于當前元素的右側,于是我們將搜索范圍的最小索引調整為 mid + 1
    • 如果大于目標值,說明目標值應該位于當前元素的左側,于是我們將搜索范圍的最大索引調整為 mid - 1
  4. 重復步驟 2 和 3,直到找到目標值或者搜索范圍為空(即 l > r),此時如果還沒有找到目標值,則返回 false
    這個方法的時間復雜度是 O(log(m*n)),空間復雜度是 O(1),因為我們在原地進行搜索,沒有使用額外的空間。

Code

class Solution {public boolean searchMatrix(int[][] matrix, int target) {int m = matrix.length, n = matrix[0].length;int l = 0, r = m * n - 1;while(l <= r){int mid = (l + r) / 2;int val = matrix[mid / n][mid % n];if(val == target){return true;}else if(val < target){l = mid + 1;}else{r = mid - 1;}}return false;}
}

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

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

相關文章

六西格瑪綠帶培訓:解鎖質量工程師的職場新篇章

在質量管理這條道路上&#xff0c;我們或許都曾有過這樣的疑問&#xff1a;為何付出了同樣的努力&#xff0c;卻未能獲得預期的回報&#xff1f;當我們看到身邊的同行們逐漸步入高薪的行列&#xff0c;而自己卻似乎陷入了職業的泥沼&#xff0c;這種對比無疑令人倍感焦慮。然而…

了解等保測評的中間件安全Tomcat,如何檢查配置是否符合安全要求?

在等保測評中&#xff0c;Tomcat中間件的安全性是一個重要的評估內容。Tomcat是一個開源的應用服務器&#xff0c;廣泛應用于Web應用程序的開發和部署。由于其易用性和靈活性&#xff0c;Tomcat成為了一個受歡迎的目標&#xff0c;被黑客攻擊和濫用。因此&#xff0c;保證Tomca…

算法提高之信使

算法提高之信使 核心思想&#xff1a;單源最短路 因為數據范圍很小 可以考慮floyd算法(三重循環) #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 110,INF 0x3f3f3f3f;int d[N][N];int n,m;int main(){cin…

【STM32-MX_GPIO_Init分析】

MX_GPIO_Init分析源碼如下&#xff1a; __HAL_RCC_GPIOE_CLK_ENABLE源碼如下&#xff1a; #define RCC ((RCC_TypeDef *) RCC_BASE) #define RCC_BASE (AHB1PERIPH_BASE 0x3800UL) #define AHB1PERIPH_BASE (PERIPH_BASE 0x00020000U…

Android Studio kotlin 轉 Java

一. 隨筆記錄 java代碼可以轉化成kotlin代碼&#xff0c;當然 Kotlin 反過來也可以轉java 在Android Studio中 可以很方便的操作 AS 環境&#xff1a;Android Studio Iguana | 2023.2.1 二. 操作步驟 1.步驟 頂部Tools ----->Kotlin ------>Show Kotlin Bytecode 步…

springcloud+nocos從零開始

首先是去nacos官網下載最新的包&#xff1a;Nacos 快速開始 | Nacos win下啟動命令&#xff1a;startup.cmd -m standalone 這樣就可以訪問你的nacos 了。 添加一個配置&#xff0c;記住你的 DataId,和Group名字。 創建一個pom項目&#xff0c;引入springCloud <?xml ve…

python中內存和磁盤交互樣例

目錄 一、內存交互 1.1 變量與數據結構 1.2 對象的創建和方法調用 1.3 操作內存中的數據 二、磁盤交互 2.1 文件讀寫 2.2 操作系統相關的文件操作 2.3 讀寫 JSON 文件 2.4 讀寫 CSV 文件 一、內存交互 內存交互&#xff1a;主要涉及變量、數據結構、對象的創建與操作…

05.13_111期_C++_紅黑樹

紅黑樹的性質 保證樹中最長路徑的長度不超過最短路徑的長度的兩倍 用什么方法保證上面這一點&#xff1f;將樹中的結點視為是有顏色的 采用如下的規則&#xff1a; rule1: 樹中的結點不是紅色就是黑色 rule2: 樹的根節點是黑色的 rule3: 如果一個結點是紅色…

遇見問題-mysql8.0.28 this is incompatible with sql_mode=only_full_group_by

1.錯誤分析以及原因 1.1.sql_mode sql_mode 是數據庫規范校驗規則&#xff0c;比如這里的sql_modeonly_full_group_by 就是一個校驗規則&#xff0c;會規定分組查詢結果集不能有GROUP BY中沒有出現的列。 1.2.問題原因 mysql 5.7.5 版本及以上版本會出現&#xff0c;mysql …

邦注科技 電解式超聲波清洗機的原理介紹

電解式超聲波去除模具表面油污銹跡的原理結合了電解和超聲波技術的優勢。 首先&#xff0c;電解作用是通過在特定的電解槽中&#xff0c;將模具作為陰極&#xff08;放入清洗框即可&#xff09;&#xff0c;并將有制式電極棒作為陽極。在電解過程中&#xff0c;電流如同魔法師…

Cache基本原理--以TC3xx為例(1)

目錄 1.為什么要使用Cache 2.Memory與Cache如何映射 2.1 地址映射概設 3.小結 為什么要使用Cache&#xff1f;為什么在多核工程里要謹慎使用DCache&#xff1f;Cache里的數據、指令是如何與Memory映射&#xff1f; 靈魂三連后&#xff0c;軟件工程師應該都會有模糊的回答&…

【虛擬仿真】Unity3D中實現對大疆無人機遙控器手柄按鍵響應

推薦閱讀 CSDN主頁GitHub開源地址Unity3D插件分享簡書地址QQ群:398291828大家好,我是佛系工程師☆恬靜的小魔龍☆,不定時更新Unity開發技巧,覺得有用記得一鍵三連哦。 一、前言 最近項目中需要用到大疆無人機遙控器對程序中無人機進行控制,遙控器是下圖這一款: 博主發…

微信小程序之九宮格抽獎

1.實現效果 2. 實現步驟 話不多說&#xff0c;直接上代碼 /**index.wxml*/ <view class"table-list flex fcc fwrap"><block wx:for"{{tableList}}" wx:key"id"><view class"table-item btn fcc {{isTurnOver?:grayscale…

基于springboot+vue+Mysql的交流互動系統

開發語言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服務器&#xff1a;tomcat7數據庫&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;數據庫工具&#xff1a;Navicat11開發軟件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

java入門詳細教程之集合的理解與應用

一、Collenction集合 數組和集合的區別 長度 數組的長度是不可變的,集合的長度是可變的 數據類型 數組可以存基本數據類型和引用數據類型 集合只能存引用數據類型,如果要存基本數據類型,需要存對應的包裝類 Collection 集合概述和使用 Collection集合概述?&#xff1a; 是單…

構建安全的GenAI/LLMs核心技術解密之大模型對抗攻擊(二)

構建安全的GenAI/LLMs核心技術解密之大模型對抗攻擊(二) LlaMA 3 系列博客 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (一) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (二) 基于 LlaMA 3 + LangGraph 在windows本地部署大模型 (三) 基于 LlaMA …

Django接口卡死一直沒有返回響應

當Django接口出現卡死且沒有返回響應時&#xff0c;可能是由于多種原因導致的。以下是一些排查和解決問題的步驟&#xff1a; 查看日志&#xff1a; 首先檢查Django的日志&#xff0c;看看是否有任何錯誤或異常被記錄。這可以幫助你確定問題的根源。 檢查數據庫連接&#xff1…

【漏洞復現】泛微OA E-Cology GetLabelByModule SQL注入漏洞

漏洞描述&#xff1a; 泛微OA E-Cology是一款面向中大型組織的數字化辦公產品&#xff0c;它基于全新的設計理念和管理思想&#xff0c;旨在為中大型組織創建一個全新的高效協同辦公環境。泛微OA E-Cology getLabelByModule存在SQL注入漏洞&#xff0c;允許攻擊者非法訪問和操…

使用庫進行Linux下串口收發通信(最簡單沒有之一)的記錄

c-periphery 是一個小型 C 庫,用于用戶空間 Linux 中的 GPIO、LED、PWM、SPI、I2C、MMIO 和串行外設 I/O 接口訪問。 c-periphery 簡化并整合了原生 Linux API 到這些接口。 c-periphery 在嵌入式 Linux 環境(包括 Raspberry Pi、BeagleBone 等平臺)中與外部外設連接非常有…

orangepi-5b 使用 rknn-toolkit2 實測

orangepi-5b 使用 rknn-toolkit2 實測 主機環境&#xff1a;ubuntu20.04 x86_64 開發板 orangepi-5b 4G ram 32G emmc 網站介紹 http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/details/Orange-Pi-5B.html 基于rk3588s 所以我們使用 rknn-toolkit2 st…