直通BAT面試演算法精講 排序(4)

2021-09-11 16:02:47 字數 2205 閱讀 3770

荷蘭國旗問題 

三色排序問題

對只包含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...