在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
解題思路:
通過迴圈遍歷二維陣列中所有元素值與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...