有乙個二維陣列(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
思路1:遍歷陣列
時間複雜度:o(m*n)
class
solution
:def
find
(self, target, array)
:#array二維列表
raw =
len(array)
#行數 col =
len(array[0]
)#列數
for i in
range
(raw)
:for j in
range
(col)
:# 如果目標值等於陣列中的值,則找到
if target == array[i]
[j]:
return
true
return
false
(錯誤思路:從左上角開始查詢是不可行,因為以左上角為基準遍歷時,要查詢的數字可能分布在兩側,所以不能很好的縮小搜尋範圍。)
思路2:以左下角或右上角開始查詢
時間複雜度:o(m+n) (行數+列數)
def
find2
(self, target, array)
: raw =
len(array)
col =
len(array[0]
)#以左下角為起點開始找
i = raw-
1 j =
0while
(i>=0)
and(j
:if target>array[i]
[j]:
j +=
1elif target
[j]:
i -=
1else
:return
true
return
false
另:對折查詢(以行列的中點開始判斷大小)、十字分割(從陣列整體的中點開始)
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。
前序遍歷:根→左→右
中序遍歷:左→根→右
思路1:遞迴重建
在前序序列中,第乙個元素a就是根節點;
此時在中序序列中,a的左邊(b、c)就是a的左孩子及其子節點,在a的右邊(d、e…i)就是a的右孩子及其子節點;
在前序序列中第二個是b,所以b就是a的左孩子;
而在中序序列,b的左邊c是b的左孩子及其子節點,在b的右邊(同是也在a的左邊)的就是b的右孩子及其子節點…
以此類推.這就是利用遞迴來重建二叉樹。
遞迴呼叫:將左子樹和右子樹分別再看成單獨一顆樹,將其前序遍歷序列、中序遍歷序列分別傳入到該函式中,便可得到左子樹的根結點、右子樹的根結點。此時需要用第一步得到的根結點連線它們;
遞迴呼叫的終止條件:直到傳入陣列為空,說明已經沒有節點,直接返回null。
:# 先定義樹的基本結構
def__init__
(self, x)
: self.val=x
self.left=
none
self.right=
none
class
solution
:def
reconstructbinarytree
(self, pre, tin):if
not pre or
not tin:
# 檢測有無中序和先序遍歷
return
none
root = treenode(pre[0]
) val = tin.index(pre[0]
)# .index可以查詢列表裡面值的下表
#遞迴呼叫
root.left = self.reconstructbinarytree(pre[
1:val+1]
, tin[
:val]
) root.right = self.reconstructbinarytree(pre[val+1:
], tin[val+1:
])return root
劍指offer 1 二維陣列查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。二維陣列是有序的,比如下面的資料 1 2 3 4 5 6 7 8 9可以直接利用左下角數字開始查詢 大於 比較...
劍指offer 1 二維陣列查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數 首先是先模擬獲取隨機遞增陣列 public static int getarray int n,int m 初...
劍指Offer 1 二維陣列查詢
劍指offer 1 二維陣列查詢 馬上也要畢業開始找工作了,自己程式設計能力實屬弟弟,笨鳥先飛,雖然飛得好像也不早了,打算每天做一道吧,爭取暑假前做完。準備秋招了,目前就是在牛客網上做題為主 題目要求是這樣 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從...