題面
給定一個包含紅色、白色和藍色,一共 n 個元素的陣列,原地對它們進行排序,使得相同顏色的元素相鄰,並按照紅色、白色、藍色順序排列。假定使用整數 0、 1 和 2 分別表示紅色、白色和藍色。要求 使用常數空間的一趟掃描演算法實現
輸入:nums = [2,0,2,1,1,0]
輸出:[0,0,1,1,2,2]
分析
- 結果集顯示分三區,以1為基準,小於,等於,大於三區
- 實質是快排的簡化版,合理設定迴圈不變數,交換陣列指標,平行賦值
解法
func sortColors(nums []int) {
// all in [0, l) = 0
// all in [l, i) = 1
// all in [r, len - 1] = 2
for i,l,r := 0,0,len(nums);i< r; {
if nums[i] == 0 {
nums[i],nums[l] = nums[l],nums[i]
l++
i++
}else if nums[i] == 1 {
i++
}else {
r--
nums[i],nums[r] = nums[r],nums[i]
}
}
}
其它
- 迴圈不變數,不重,不漏,不越界
- 開閉區間,交換,自增,自減有序,合理
本作品採用《CC 協議》,轉載必須註明作者和本文連結