劍指offer 二維陣列中的查詢

2021-10-23 12:50:10 字數 2948 閱讀 3202

題目描述

在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

本題考查的知識點是:陣列、查詢

首先回顧下常用的查詢演算法:順序查詢和二分查詢

順序查詢:逐個的查詢,找到返回true或該元素下標,找不到則返回false或-1;

二分查詢:前提是有序陣列中查詢,從中間元素開始,若找到則返回true或該元素下標,如果某一特定元素大於或者小於中間元素,則在陣列大於或小於中間元素的那一半中查詢,而且跟開始一樣從中間元素開始比較。

接下來其入正題:

方法一:

我們可以直接用順序查詢的方法解決這道題:

時間複雜度為o(n^2)

空間複雜度o(1)

bool

find

(int target, vector

int>

> array)}}

return

false

;}

但是,我們沒有利用題目中的一些重要資訊:陣列從左到右遞增,從上到下遞增。這個時候,二分法可以適用

方法二:

對每一列進行二分查詢

時間複雜度:o(n*lgn)

空間複雜度:o(1)

int m = array.

size()

;int n = array[0]

.size()

;if(m ==

0|| n ==0)

return

false

;for

(int i =

0; i < m; i++

)else

if(array[i]

[j]> target)

else

j = begin +

(end - begin)/2

;}}return

false

;}

方法三:矩陣是有序的:利用二維陣列由上到下,由左到右遞增的規律。

左下角元素m是行中最小的,是一列中最大的。

當m == target時,查到結果,直接返回;

當m > target時,因為m是一行中最小的,所以向上移動一行,繼續查詢;

當m < target時,因為m是一列中最大的,所以向右移動一列,繼續查詢

我們選取左下角為起始位置:

時間複雜度:o(m+n) ,其中m為行數,n為列數,最壞情況下,需要遍歷m+n次。

空間複雜度:o(1)

bool

find

(int target, vector

int>

> array)

else

if(array[i]

[j]< target)

else

}return

false

;}

下面的方法是摘自牛客上「遺忘201901051244512」的題解

拓展:雙折半查詢

二維陣列分為上下左右四個邊界top,bottom,left,right:

對上邊界top進行折半查詢,假設終止點為e,則可以將二維陣列位於終止點e右邊的矩形rr排除,因為終止點e小於其右邊相鄰的元素e+1,而e+1是右邊矩形rr的最小元素(左上元素)

同理,對下邊界bottom折半,可以排除二維陣列位於終止點e左邊的矩形rl排除,

對左邊界left折半,可以排除二維陣列位於終止點e下邊的矩形rb排除,

對右邊界right折半,可以排除二維陣列位於終止點e上邊的矩形rt排除,

一輪過去,邊界範圍縮小,對由新邊界組成的矩形重複以上操作,直到範圍縮小為只有乙個元素。

十字分割法

我首先想到的是這種方法,不過要注意這種方法無論是從思維還是實現過程都比較麻煩,實戰慎用。

1.分析:在主對角線方向上進行查詢操作,直到乙個元素大於目標,該終止點的左上區域與右下區域都可以排除,再遞迴剩下的左下、右上兩個區域。

2.**

bool

find_2

(int target, vector

int>

> array)

stack_elem;

stack_elem temp, newtemp;

stack s;

temp.xmax = temp.ymax = array.

size()

-1; s.

push

(temp)

;while

(!s.

empty()

)else

if(x == temp.xmax)

else

if(y == temp.ymax)

else

// 情況4:繼續查詢}}

return0;

}3.複雜度

時間複雜度:採用二分查詢時為o(lgn)、採用順序查詢時為o(nlgn)

空間複雜度:o(1)

劍指offer 二維陣列中查詢

在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和一 個整數,判斷陣列中是否含有該整數。public class solution 因為陣列每一行都按照從左到右遞增的順序排序,每一列都按照從上到下...

劍指offer 二維陣列中查詢

從今天開始每天一題,除了節假日。在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution return false class solut...

劍指offer 二維陣列中查詢

要求如下 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數 示例如下 7,1,2,8,9 2,4,9,12 4,7,10,13 6,8,11,15 思路有三種,...