荷蘭國旗問題
三色排序問題
對只包含0,1,2的整數陣列進行排序,要求使用交換、原地排序,而不是利用計數進行排序,做到0全在陣列左邊,1在中間,2在右邊
本題主要過程和快排劃分過程類似
測試用例:
arr = [1,1,0,0,2,1,1,0]
輸出:[0,0,0,1,1,1,1,2]
解題思路:
在陣列左側設定乙個0區域,初始長度為0,在陣列右側設定乙個2區域,初始長度為0
從左右到遍歷,如果當前值為1,直接跳到下乙個位置。
若當前數為0,則將其與0區域的下乙個元素交換,並將0區域向右擴散。
若當前數為2,則將其與2區域的前乙個元素交換,並將2區域向前擴散。判斷交換後的當前值是否還需再次交換
直至當前位置與2區域的左邊界相等為止
時間複雜度為o(n),空間複雜度為o(1)
def sort(arr):
if not arr:
return arr
index0 = 0
index2 = len(arr)-1
i = 0
while i <= index2:
if arr[i] == 0:
exchange(arr,i,index0)
index0 += 1
if arr[i] == 2:
exchange(arr,i,index2)
index2 -= 1
i -= 1 #這步很關鍵,與後面元素交換後,當前位置不變
i += 1
return arr
def exchange(arr,i,j):
arr[i],arr[j] = arr[j],arr[i]
二維陣列查詢
在行列都排好序的矩陣中找數
0 1 2 5
2 3 4 7
4 4 4 8
5 7 7 9
若k為7,返回true;若k為6,返回false。
若矩陣為(m*n),該題最優解可以做到時間複雜度o(m+n),額外空間複雜度o(1)。
方法,從右上角或者左下角找。
解題思路:
從右上角開始查詢,如果這個值大於被查詢的值的話,減去一列
如果這個值比被查詢的值小的話,減去一行
def search(arr,k):
if not arr:
return false
rows = len(arr)
cols = len(arr[0])
row = 0
col = cols -1
while row0:
if arr[row][col] > k:
col -= 1
elif arr[row][col] < k:
row += 1
else:
return true
return false
需要排序的最短子陣列問題
給定乙個陣列,要求返回該陣列中需要排序的最短子陣列的長度
測試用例:
arr=[1,5,4,3,2,6,7]
返回:4
因為只有[5,4,3,2]需要排序
解題思路:
從左到右遍歷,記錄最大值,只關心右邊數比左邊數小的這種情況,並記錄發生這種情況最右的位置。
從右往左遍歷,記錄最小值,和比最小值大的最左邊的數的下標。
最左位置至最右位置這段,就是需要排序的陣列長度
def shortest_arr(arr):
if not arr:
return 0
n = len(arr)
max = arr[0]
min = arr[n-1]
left = n-1
right = 0
for i in range(1,len(arr)):
if arr[i] >= max:
max = arr[i]
else:
right = i
for i in range(n-1,-1,-1):
if arr[i] <= min:
min = arr[i]
else:
left = i
if left
直通BAT面試演算法精講 排序(1)
注 所有的 都是用python實現的,都是自己寫的,可能有些地方不太完善 時間複雜度 o n 2 空間複雜度 o 1 思想 依次訪問元素,逆序就置換。一趟排序後最大 小 的被置換到最後 def bubble sort arr,n ifnot arr return none for i in rang...
直通BAT面試演算法精講 鍊錶(1)
鍊錶問題知識點和注意事項 1.鍊錶問題演算法難度不高,但考察 實現能力。2.鍊錶和陣列都是一種線性結構,陣列是一段連續的儲存空間,鍊錶空間不一定保證連續,是臨時分配的 鍊錶問題 實現關鍵點 1.鍊錶調整函式的返回值,型別要求往往是節點型別。2.處理鍊錶過程中,先採用畫圖的方式理清邏輯。3.鍊錶問題對...
直通BAT面試演算法精講課2
對於乙個int陣列,請編寫乙個氣泡排序演算法,對陣列元素排序。給定乙個int陣列a及陣列的大小n,請返回排序後的陣列。測試樣例 1,2,3,5,2,3 6 1,2,2,3,3,5 冒泡 依次比較相鄰,大的放後面。class bubblesort return a class bubblesort r...