演算法之尋找二維矩陣中的目標值

2021-10-23 18:48:43 字數 1839 閱讀 3846

* 編寫乙個高效的演算法來搜尋 m x n 矩陣 matrix 中的乙個目標值 target。

* 該矩陣具有以下特性:

* 每行的元素從左到右公升序排列。

* 每列的元素從上到下公升序排列。

* * 示例:

* 現有矩陣 matrix 如下:

* [* [1, 4, 7, 11, 15],

* [2, 5, 8, 12, 19],

* [3, 6, 9, 16, 22],

* [10, 13, 14, 17, 24],

* [18, 21, 23, 26, 30]

* ]* * 給定 target = 5,返回 true。

* 給定 target = 20,返回 false。

因為二維陣列是有序的,所以不難想到使用二分法查詢,方法很簡單,這裡貼出個人的初期**。

/// 

/// 在矩陣中搜尋目標值

///

/// 二維矩陣

/// 目標值

/// 結果

public

bool

searchmatrix

(int[,

] matrix,

int target)

else

if(matrix[i, mid]

< target)

else}if

(matrix[i, start]

== target || matrix[i, end]

== target)

return

true;}

return

false

;}

**不做過多解釋,實在不理解的先去了解下二分法的具體過程。本函式有一處右移(>>)的操作,作用跟除以2差不多,不習慣的朋友可以把 >> 1改為 / 2。

c#初始化二維陣列的**可以這樣寫:

int[,

] matrix =

newint[,

],,,

,};

然後讀者自行去驗證上面那個函式的正確性即可,反正本人驗證是沒啥問題的~

上述解法好像是沒啥問題,然後效率的話肯定是要比單純遍歷快不少的。然而這時細心的朋友可能會發現,題目中對於矩陣的第二個限制條件,也就是矩陣每列元素從上到下是公升序排列的,這個條件我們好像沒有利用上。

當時我發現這一點時,最先想到的是做兩層二分,就是先對矩陣第一列做二分確定行(就是說找到一行第乙個元素比目標值小,然後他的下一行比目標值大,然後再對這一行做二分)。隨即馬上我就發現了這種想法的錯誤性,因為題中並不能保證第二行的首元素大於第一行的任一元素,實際上觀察給出的初始矩陣也能得出結論。

那麼,難道沒有別的辦法了嗎,答案肯定是有的。

我們再來仔細觀察一下這個矩陣,不難發現矩陣左下角的元素其上方元素均比他小,其右方元素均比他大,矩陣右上角的元素其左方元素均比他小,其下方元素均比他大。既然這樣,那我們先選矩陣左下角或矩陣右上角的元素跟目標值target比較,然後根據比較結果再進行下一步比較不就ok了嗎?

這裡採用的是把矩陣左下角元素作為起始點,如果想選矩陣右上角元素作為起始點的朋友可以自行去寫出這部分,方法都是類似的。

public

bool

searchmatrix

(int[,

] matrix,

int target)

return

false

;}

相信經過這個題,大家一定也對演算法產生了更深的興趣,很喜歡的一句話分享給你們。

from zero to hero.

面試題 搜尋二維矩陣中是否存在目標值

最簡單的是暴力遍歷,好一點的可以用二分查詢。但是這兩題其實可以用同乙個思路解決 從矩陣的左下角或者右上角開始判斷,以左下角開始為例 另外注意特殊情況,matrix為或是的判斷。class solution object def searchmatrix self,matrix,target type...

在轉動過的有序陣列中尋找目標值(牛客網)

原題來自牛客網 鏈結 給出乙個轉動過的有序陣列,你事先不知道該陣列轉動了多少 例如,0 1 2 4 5 6 7可能變為4 5 6 7 0 1 2 在陣列中搜尋給出的目標值,如果能在陣列中找到,返回它的索引,否則返回 1。假設陣列中不存在重複項。有序陣列中查詢一般使用二分查詢,但是這道題進行了轉動。以...

尋找二維矩陣裡的乙個數

題目是 乙個二維矩陣,給乙個數,判斷這個數存不存在於這個矩陣當中,當然,這個矩陣也是乙個有規律的矩陣。即從上往下,從左往後都是遞增的。最普通的就是從上到下,從左到右乙個乙個的進行判斷尋找。這時,在最壞情況下,就得將整個矩陣輪訓一遍。那麼時間複雜度就為o n 那麼可不可以減少呢?就要從這個矩陣的特殊地...