劍指offer 1 二維陣列中的查詢

2021-10-04 23:14:33 字數 1772 閱讀 8729

這道題是陣列查詢題,與leetcode74題不同,這道題的輸入矩陣可能為

1 57

8269

1031012

14\begin 1&5&7&8\\ 2&6&9&10\\ 3&10&12&14 \end

123​56

10​7

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 初...