LeetCode 75 Medium 顏色排序 Python
阿新 • • 發佈:2018-12-31
def sortColors( nums): """ 演算法:類似三路快排的多指標法 思路: 其實比較容易聯想到用類似於三路快排的做法,其實只看題意的話也應該聯想到用類似於快排的做法 因為就是對0,1,2進行排序嘛, 0,1,2以1做為pivot分割的話正好就是小於1的是一撮,大於1的是一撮,也就是0,1,2的排序 那麼就可以借用三路快排的思路來做 注意red,white,blue分別對應於0,1,2 設定red_end,i,blue_start分別表示如下含義: red:[0,red_end) white[red_end,i) blue:[blue_start+1,end] red_end記錄最後一個紅色的後一個位置,i記錄最後一個white的後一個位置,blue_start記錄blue開始的前一個位置 初始設red_end,i=0,blue_start = len -1 ,注意,因為是這樣設定的初始條件,所以當檢測到一個2,即blue時, 對將blue_start的位置與i對調後只將blue_start -= 1,i不後挪,因為調換過來的值還不能確定就要放在i這裡,所以 下一次迴圈時會挪動他,這裡的感覺就像是快排如果選nums[lo]=pivot時,就要先從右邊hi的位置開始判斷是一樣的 反正大體思路就是,發現一個blue,根據blue_start去調換位置,放在blue區域,發現一個white,i+=1,不用管 發現一個red,調換,然後red_end+=1,i+=1 [0...red_end,white_white_white,blue_start....end] """ red_end, i, blue_start = 0, 0, len(nums) - 1 while i <= blue_start: if nums[i] == 1: i += 1 elif nums[i] == 2: nums[i], nums[blue_start] = nums[blue_start], nums[i] blue_start -= 1 else: nums[i], nums[red_end] = nums[red_end], nums[i] red_end += 1 i += 1