Python求解二維陣列中的查詢問題

2021-10-06 02:48:50 字數 2823 閱讀 3269

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

解題思路:

通過迴圈遍歷二維陣列中所有元素值與target值進行比較(暴力破解,非常好理解,不過複雜度相對高一點,但是也能編譯通過)

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

附python**:

# -*- coding:utf-8 -*-

class solution:

# array 二維列表

def find(self, target, array):

# write code here

col = len(array[0]) #列

row = len(array) #行

for i in range(0,col):

for j in range(0,row):

if target == array[i][j]:

return true

return false

其他解題思路:

題意中指出 :每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。然而上面那種解題思路沒有用到這個,即便不是有序的陣列,一樣可以查詢到目標值target。但是題目給了有序的先決條件,這足以說明這道題一定有巧妙地解法。

每一行都按照從左到右遞增的順序排序,這樣的陣列

【 [ 1  2  3  4 ]

[ 5  6  7  8 ]】

如果我們要找 target=5,通過比較第一行最後乙個元素值 我們就能知道target=5 > 4 所以根據題意每一行都按照從左到右遞增的順序排序,我們要找的target值肯定不在第一行,減少了遍歷第一行的次數,我們再去將target值與第二行最後乙個元素比較,target=5 < 8 所以這個target值如果存在於這個陣列中(陣列中可能不存在目標值,返回false)則它肯定在這行中,我們在從這行最後乙個元素向前遍歷,就能找到目標值target了 。如果我們要找目標值target = 3  它小於 4 我們就知道它如果存在 就只能在第一行中。

時間複雜度為o(n)

附**:

class solution:

def find_test(self, target, array):

# write code here

col = len(array[0]) #列

row = len(array) #行

i=0j=col-1

while(i < row and j >=0):

if target > array[i][j]:

i+=1

elif target < array[i][j]:

j-=1

else:

return true

return false

if __name__ == '__main__':

s=solution()

print(s.find_test(9,[[1,3,4,7],[2,5,6,8]]))

二分查詢的解題思路:

複雜度相對高一點的   分別對每一行進行二分查詢,還有一種是對整個陣列進行拆分。

對於傳統二分查詢演算法:

定義:二分查詢又稱折半查詢,它是一種效率較高的查詢方法。二分查詢要求:線性表是有序表,即表中結點按關鍵字有序,並且要用向量作為表的儲存結構。不妨設有序表是遞增有序的。

演算法思想:設r[low..high]是當前的查詢區間

(1)首先確定該區間的中點位置:mid = (low + high) /2

(2)然後將待查的k值與r[mid].key比較:若相等,則查詢成功並返回此位置,否則須確定新的查詢區間,繼續二分查詢,具體方法如下:

①  若r[mid].key>k,則由表的有序性可知r[mid..n].keys均大於k,因此若表中存在關鍵字等於k的結點,則該結點必定是在位置mid左邊的子表r[1..mid-1]中,故新的查詢區間是左子表r[1..mid-1]。

②  若r[mid].key因此,從初始的查詢區間r[1..n]開始,每經過一次與當前查詢區間的中點位置上的結點關鍵字的比較,就可確定查詢是否成功,不成功則當前的查詢區間就縮小一半。這一過程重複直至找到關鍵字為k的結點,或者直至當前的查詢區間為空(即查詢失敗)時為止。

**(python):

'''

二分查詢

'''class solution:

def binarysearch(self , key , a):

low = 0

high = len(a)

mid = int((low+high)/2)

if key == a[mid]:

return true

elif key > a[mid]:

low = mid + 1

mid = int((low+high)/2)

else:

high = mid - 1

mid = int((low+high)/2)

return false

if __name__=="__main__":

s=solution()

print(s.binarysearch(5,[1,2,3,4,6,9,12,16]))

待更新。。。。

總結:關於查詢型別的題,要先看給定的資料是否有序;對於有序的資料要利用它有序的特點,應用特殊的解法。如:二分查詢,找特殊起始點等.

二維陣列最值求解

package arithmetic 對於二維陣列,每一行的最大值集合裡一定有整個陣列的最大值 對於每一列的最大值,邏輯是類似的 author zengsht public class maxarray 儲存每一行的最大值 int temp1 new int 5 for int i 0 i 5 i ...

二維陣列中查詢 python

最近為了筆試瘋狂刷程式設計題。實際參加筆試後才發現,對於程式設計題的掌握還是非常欠缺。同樣的思想,變種考法就不會了。所以有必要對程式設計題做乙個系統性的總結。接下來會寫很多篇部落格。每篇會把原題寫上,並陸續補充相同思想的題。coding utf 8 class solution array 二維列表...

python中定義二維陣列

原文 今天在寫力扣5.最長回文子串,二維陣列這麼定義的 dp false size size然後後面發現,更改資料的時候會一列一起被修改 即原文所說的第一種情況 正確的方法是 dp false for in range size for in range size 原文第三種 原文第二種方法 c p...