LeetCode 熱題 100_搜索二維矩陣(64_74_中等_C++)(二分查找)(暴力破解法;Z字形查找;一次二分查找)

LeetCode 熱題 100_搜索二維矩陣(64_74)

    • 題目描述:
    • 輸入輸出樣例:
    • 題解:
      • 解題思路:
        • 思路一(暴力破解法):
        • 思路二(Z字形查找):
        • 思路三(一次二分查找(將二維轉換為一維)):
      • 代碼實現
        • 代碼實現(思路一(暴力破解法)):
        • 代碼實現(思路二(Z字形查找)):
        • 代碼實現(思路三(一次二分查找(將二維轉換為一維))):
        • 以思路三為例進行調試
        • 部分代碼解讀

題目描述:

給你一個滿足下述兩條屬性的 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

題解:

解題思路:

思路一(暴力破解法):

1、將二維矩陣每個元素與target進行比較。
2、復雜度分析:
① 時間復雜度:O(mn),其中m和n分別是矩陣的行數和列數。
② 空間復雜度:O(1)。

思路二(Z字形查找):

1、選取劃分的區間:
① 發現右上角元素的左側是比其小的元素,下方是比其大的元素(僅看當前元素所在的行和列)。
② 發現左下角元素的上側是比其小的元素,右側是比其大的元素(僅看當前元素所在的行和列)。
③ 而左上角和右下角則不能劃分大小區間
選擇以左下角元素為基準元素,(也可選右上角元素為基準元素)
相似題目(講解更詳細):
LeetCode 熱題 100_搜索二維矩陣 II(21_240_中等_C++)(Z 字形查找)

2、復雜度分析
① 時間復雜度:O(m+n),其中m和n分別為矩陣行數和列數,此算法最多循環 m+n 次。
② 空間復雜度:O(1)。

思路三(一次二分查找(將二維轉換為一維)):

1、將二維數組看作是一維數組進行處理(運用“%”映射到一維)。
例:
在這里插入圖片描述
按照一維數組空間展開為:[1,3,5,7,10,11,16,20,23,30,34,60]
一維:中間元素取11,其下標為 5
二維:中間元素取11,其下標為 [1,1]
5/3(column_size)=1(行)
5%4(column_size)=1(列)
一維和二維的對應關系為:
一維元素的下標 / 矩陣列數 = 二維元素的行下標
一維元素的下標 % 矩陣列數 = 二維元素的列下標

2、復雜度分析:
① 時間復雜度:O(logmn),其中m和n分別是矩陣的行數和列數。
② 空間復雜度:O(1)。

代碼實現

代碼實現(思路一(暴力破解法)):
bool searchMatrix1(vector<vector<int>>& matrix, int target) {for (int row = 0; row < matrix.size(); row++){for (int col = 0; col < matrix[0].size(); col++){if(matrix[row][col]==target){return true;}}}return false;
}
代碼實現(思路二(Z字形查找)):
bool searchMatrix2(vector<vector<int>>& matrix, int target) {// 初始化row為矩陣的最后一行,col為矩陣的第一列(左下角元素)int row = matrix.size() - 1;int col = 0;// 循環直到超出矩陣邊界while (row >= 0 && col < matrix[0].size()) {// 如果當前元素等于目標值,返回trueif (matrix[row][col] == target) {return true;}// 如果當前元素大于目標值,說明目標值在當前行的上方,向上移動一行else if (matrix[row][col] > target) {--row;}// 如果當前元素小于目標值,說明目標值在當前列的右側,向右移動一列else {++col;}}// 如果沒有找到目標值,返回falsereturn false;
}
代碼實現(思路三(一次二分查找(將二維轉換為一維))):
//方法三:一次二分查找
bool searchMatrix3(vector<vector<int>>& matrix, int target) {// 獲取二維數組的行數和列數int row_size = matrix.size(), col_size = matrix[0].size();// 初始化二分查找的左邊界和右邊界// 通過將二維矩陣轉換成一維數組來處理int left = 0, right = row_size * col_size - 1, mid;// 當左邊界不超過右邊界時,繼續進行二分查找while (left <= right) {// 計算中間索引 mid,使用位移操作 >>1 代替除以2,提高效率mid = left + ((right - left) >> 1);// 將中間索引對應到二維矩陣中的位置,mid / col_size 為行,mid % col_size 為列int x = matrix[mid / col_size][mid % col_size];// 如果目標值小于當前值,移動右邊界if (x > target) {right = mid - 1;}// 如果目標值大于當前值,移動左邊界else if (x < target) {left = mid + 1;}// 找到目標值,返回 trueelse {return true;}}// 如果未找到目標值,返回 falsereturn false;
}
以思路三為例進行調試
#include<iostream>
#include<vector>
using namespace std;class Solution {
public://方法三:一次二分查找bool searchMatrix3(vector<vector<int>>& matrix, int target) {// 獲取二維數組的行數和列數int row_size = matrix.size(), col_size = matrix[0].size();// 初始化二分查找的左邊界和右邊界// 通過將二維矩陣轉換成一維數組來處理int left = 0, right = row_size * col_size - 1, mid;// 當左邊界不超過右邊界時,繼續進行二分查找while (left <= right) {// 計算中間索引 mid,使用位移操作 >>1 代替除以2,提高效率mid = left + ((right - left) >> 1);// 將中間索引對應到二維矩陣中的位置,mid / col_size 為行,mid % col_size 為列int x = matrix[mid / col_size][mid % col_size];// 如果目標值小于當前值,移動右邊界if (x > target) {right = mid - 1;}// 如果目標值大于當前值,移動左邊界else if (x < target) {left = mid + 1;}// 找到目標值,返回 trueelse {return true;}}// 如果未找到目標值,返回 falsereturn false;}};int main(){vector<vector<int>> matrix={{1,3,5,7},{10,11,16,20},{23,30,34,60}};int target=3;Solution s;if (s.searchMatrix3(matrix,target)){cout<<"true";}else{cout<<"false";}return 0;
}
部分代碼解讀

”>>“ 與 “/” 對比 :LeetCode 熱題 100_搜索插入位置(63_35_簡單_C++):請點擊此鏈接查看部分代碼解讀部分

LeetCode 熱題 100_搜索二維矩陣(64_74)原題鏈接
歡迎大家和我溝通交流(????)

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

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

相關文章

從CNN到Transformer:遙感影像目標檢測的技術演進(礦產勘探、精準農業、城市規劃、林業測量、軍事目標識別和災害評估等)

在遙感影像分析領域&#xff0c;目標檢測一直是研究熱點之一。隨著高分辨率對地觀測系統的不斷發展&#xff0c;遙感影像的分辨率和數據量呈爆發式增長&#xff0c;如何高效、準確地從海量數據中提取有用信息&#xff0c;成為了一個亟待解決的問題。近年來&#xff0c;深度學習…

【rt-thread】rt-thread 控制 led 的兩種方式

1. pin設備 #define LED_PIN 3int led(void) {rt_uint8_t count;rt_pin_mode(LED_PIN, PIN_MODE_OUTPUT); for(count 0 ; count < 10 ;count){ rt_pin_write(LED_PIN, PIN_HIGH);rt_kprintf("led on, count : %d %d\r\n", count, rt_pin_read(LED_PIN));…

Excell 代碼處理

文章目錄 Excell 代碼處理cvc格式xlsl格式小結 Excell 代碼處理 有時候要對excell進行分析&#xff0c;或者數據的導入導出&#xff0c;這個時候如果可以用代碼讀寫分析操作那么會方便很多 cvc格式 CSV&#xff08;Comma-Separated Values&#xff0c;逗號分隔值&#xff09;是…

新手小白如何挖掘cnvd通用漏洞之存儲xss漏洞(利用xss釣魚)

視頻教程和更多福利在我主頁簡介或專欄里 &#xff08;不懂都可以來問我 專欄找我哦&#xff09; 如果對你有幫助你可以來專欄找我&#xff0c;我可以無償分享給你對你更有幫助的一些經驗和資料哦 目錄&#xff1a; 一、XSS的三種類型&#xff1a; 二、XSS攻擊的危害&#x…

代碼隨想錄算法【Day52】

Day51 101. 孤島的總面積 思路 從周邊找到陸地然后 通過 dfs或者bfs 將周邊靠陸地且相鄰的陸地都變成海洋&#xff0c;然后再去重新遍歷地圖 統計此時還剩下的陸地 代碼 #include <iostream> #include <vector> using namespace std; int dir[4][2] {-1, 0, …

Python開源項目月排行 2024年12月

#2024年12月2025年1月21日1DeepSeek-Coder-V2一個開源的專家混合&#xff08;MoE&#xff09;代碼語言模型&#xff0c;其在代碼特定任務中的性能可與GPT4-Turbo相媲美。具體而言&#xff0c;DeepSeek-Coder-V2是在DeepSeek-V2的一個中間檢查點上進一步預訓練的&#xff0c;增加…

Resource not found: roslaunchROS path [0]=/opt/ros/noetic/share/ros

解決辦法&#xff1b; cd ~/catkin_ws rm -rf build/ devel/ catkin_make source devel/setup.bash sudo apt-get install ros-noetic-roslaunch 輸入roscore后

.NET + Vue3 的前后端項目在IIS的發布

目錄 一、發布準備 1、安裝 IIS 2、安裝 Windows Hosting Bundle&#xff08;.NET Core 托管捆綁包&#xff09; 3、安裝 IIS URL Rewrite 二、項目發布 1、后端項目發布 2、前端項目發布 3、將項目部署到 IIS中 三、網站配置 1、IP配置 2、防火墻配置 3、跨域配置…

指定定網卡名稱

一、PCIe網卡名稱指定 原理&#xff1a;利用udev規則匹配PCIe設備的硬件特征&#xff08;如總線位置、MAC地址等&#xff09;&#xff0c;覆蓋默認命名規則 4 。 步驟&#xff1a; 獲取設備信息&#xff1a; Bash udevadm info -a -p /sys/class/net/<原設備名> # 如e…

【python】解析自動化腳本文件并按照=測試周期=存儲記錄

【python】連接Jira獲取token以及jira對象 【python】解析自動化腳本文件并按照測試周期存儲記錄 【python】向Jira推送自動化用例執行成功 【python】向Jira測試計劃下&#xff0c;附件中增加html測試報告 將已編寫的自動化測試用例按照jira號解析出來&#xff0c;并按照測試計…

Linux驅動開發之音頻驅動與基礎應用編程

目錄 CODEC芯片 音頻編碼 I2S總線接口 數字音頻接口(DAI) 設備樹配置 ALSA 音頻相關概念 應用程序編寫 運行測試 CODEC芯片 音頻若想被CPU“聽到”&#xff0c;就必須轉換為CPU能夠“聽懂”的語言&#xff0c;即二進制數據的0和1。在信號處理領域&#xff0c;聲音是模…

在 Java 中解析 JSON 數據

例子解析以下JSON數據 {"code":0,"msg":"成功","data": [{ "host":"1068222.com", "port":"", "m_token":"490e20e70e7de5f21a24b14c12a393f6", "categ…

python——集合(一)

文章目錄 集合 set創建集合訪問集合項in關鍵字添加集合元素刪除集合元素復制集合使用操作符對集合進行交集、并集、差集、對稱差集使用方法對集合進行交集、并集、差集、對稱差集子集和超集 frozenset 凍結集合&#xff1f; 不可變集合&#xff01; 集合 set 什么是集合&#…

DeepSeek 與網絡安全:AI 在網絡安全領域的應用與挑戰

&#x1f4dd;個人主頁&#x1f339;&#xff1a;一ge科研小菜雞-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 1. 引言 在當今數字化時代&#xff0c;網絡安全已成為國家、企業和個人面臨的重要挑戰。從傳統的病毒、木馬攻擊&#xff0c;到高…

【Blender】二、建模篇--05,陣列修改器與晶格形變

陣列修改器是bender里面一個比較常用的修改器,所以我們單獨開口來講,我們會先從幾片樹葉出發,然后我們用陣列修改器把這幾片樹葉變成這樣的造型和這樣的造型。這兩個造型分別就代表著陣列修改器最常用的兩種偏移方法,我們現在就開始我們先來做幾個樹葉。 1.樹葉建模 首先…

【Python 專題】數據結構 樹

LeetCode 題目104. 二叉樹的最大深度(gif 圖解)方法一:后序遍歷(DFS)方法二:層序遍歷(BFS)872. 葉子相似的樹(DFS 遍歷)1448. 統計二叉樹中好節點的數目(DFS 遍歷)437. 路徑總和 III(前綴和 + DFS 回溯)1372. 二叉樹中的最長交錯路徑(DFS)236. 二叉樹的最近公共…

Linux下基本指令(4)

Linux權限的概念 Linux下有兩種用戶&#xff1a;超級用戶&#xff08;root&#xff09;、普通用戶。 超級用戶&#xff1a;可以再linux系統下做任何事情&#xff0c;不受限制 普通用戶&#xff1a;在linux下做有限的事情。 超級用戶的命令提示符是“#”&#xff0c;普通用戶…

ubuntu部署小筆記-采坑

ubuntu部署小筆記 搭建前端控制端后端前端nginx反向代理使用ubuntu部署nextjs項目問題一 如何訪問端口號配置后臺運行該進程pm2 問題二 包體過大生產環境下所需文件 問題三 部署在vercel時出現的問題需要魔法訪問后端api時&#xff0c;必須使用https協議電腦端訪問正常&#xf…

【聯盛德 W803-Pico 試用】簡介、工程測試

【聯盛德 W803-Pico 試用】簡介、工程測試 本文介紹了聯盛德微電子 W803-Pico 開發板的基本信息、環境搭建、工程測試等內容。簡介包含開發板功能、主控參數及特點、開發板原理圖等信息&#xff0c;工程測試包括 Blink、串口打印等方案的演示。 活動詳情&#xff1a;聯盛德問答…

cursor使用記錄

一、如何查看自己登錄的是哪個賬號 操作路徑&#xff1a;Cursor -- 首選項 -- Cursor Setting &#xff08;有快捷鍵&#xff09; 二、狀態修改為豎排&#xff08;默認是橫排&#xff09; 默認如圖展示&#xff0c;想要像vscode、idea等等在左側豎著展示 操作路徑&#xff1…