這道題是陣列查詢題,與leetcode74題不同,這道題的輸入矩陣可能為
1 57
8269
1031012
14\begin 1&5&7&8\\ 2&6&9&10\\ 3&10&12&14 \end
12356
107
912
8101
4也就是上一行的數字大小可能會大於下一行的數字大小。看到這道題的時候我首先想的是分治的方法。先選矩陣最中間位置的元素,如圖中紅色元素,比較該元素與target的大小差別,如果該元素比target大,則target只會出現在左圖中淺藍色的區域,所以依次判斷這三部分淺藍色區域是否有target即可,如果該元素比target小,同理選擇右圖中淺藍色區域進行判斷。這時原問題就分解為了f(n
)=3f
(n/4
)+cf(n)=3f(n/4)+c
f(n)=3
f(n/
4)+c
,其中c是常數,計算過後,發現時間複雜度為o(n
0.8)
o(n^)
o(n0.8
)左右,然而由於切割操作**需要考慮的太多,所以就暫時將此方法丟棄了。
看了題解之後,發現題解巧妙的運用了輸入資料的特點,也就是矩陣右下角的元素比整個矩陣的元素都大,矩陣左上角元素一定比整個矩陣的元素都小。如果從a位置開始考慮,比a小的元素只會出現在a、b區域,也就是比a的列數小的區域,比a大的元素只會出現在b、c區域,也就是比a的行數大的區域。在比較完a元素與target大小區別後,假設a比target小,那麼將行號+1,到達b位置,此時只用考慮d、b、c區域即可,思路同a元素,假設b比target大,那麼將列號-1,到達c位置,此時只用考慮d、b、e區域即可,a、c區域不用再考慮。
此方法避免了之前所說方法的矩陣分割問題,直接用行號列號加減即可得到比當前位置元素大或小的區域。而且由於每一步都會刪去一定的不可能出現target的區域,所以每個每個與target相比較的元素都是可能解區域的右上角元素,從而使得每一步的操作均相同。
思考:可以從矩陣的四個角進行考慮,不用從矩陣中間進行考慮,即可節省很多矩陣分割的操作。
完整**:
# -*- coding:utf-8 -*-
class
solution
:# array 二維列表
deffind
(self, target, array)
:# write code here
row =
0 col =
len(array[0]
)-1# 從右上角開始考慮
while row <
len(array)
and col >=0:
if target == array[row]
[col]
:return
true
elif target > array[row]
[col]
: row +=
1else
: col -=
1return
false
Python 劍指offer(1)二維陣列的查詢
題目 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。環境python2.7.3 解 coding utf 8 class solution array 二維...
劍指offer 1 二維陣列查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。二維陣列是有序的,比如下面的資料 1 2 3 4 5 6 7 8 9可以直接利用左下角數字開始查詢 大於 比較...
劍指offer 1 二維陣列查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數 首先是先模擬獲取隨機遞增陣列 public static int getarray int n,int m 初...