1. 程式人生 > >LeetCode 75 Medium 顏色排序 Python

LeetCode 75 Medium 顏色排序 Python

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