題目描述
在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
本題考查的知識點是:陣列、查詢
首先回顧下常用的查詢演算法:順序查詢和二分查詢
順序查詢:逐個的查詢,找到返回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 思路有三種,...