給定一個包含紅色、白色和藍色,一共 n 個元素的數組,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。
此題中,我們使用整數 0、 1 和 2 分別表示紅色、白色和藍色。
注意:
不能使用代碼庫中的排序函數來解決這道題。
示例:
輸入: [2,0,2,1,1,0]
輸出: [0,0,1,1,2,2]
僅使用常數空間的一趟掃描算法
思路:參考三路快排,定義兩個指針zero和two,使得nums中從0到zero之間的數全爲0,從two到n-1位置的數全爲2,zero到i之間的數全爲1
定義循環索引i
如果nums[i] == 0則將nums[zero+1]與nums[i]互換,zero指針向後移動一位,i也向後移動一位
如果nums[i] == 2則將 nums[two-1]與nums[i]互換,two指針向前移動一位
如果nums[i] == 1則i++
class Solution(object):
def sortColors(self, nums):
"""
:type nums: List[int]
:rtype: None Do not return anything, modify nums in-place instead.
"""
zero = -1 # nums[0 to zero] == 0
two = len(nums) # nums[two to n-1] == 2
i = 0
while i < two:
if nums[i] == 1:
i = i + 1
elif nums[i] == 2:
two = two - 1
nums[i], nums[two] = nums[two], nums[i]
elif nums[i] == 0:
zero = zero + 1
nums[zero], nums[i] = nums[i], nums[zero]
i = i + 1 # i要隨着zero動,i不能比他小
return nums