迴圈不變數之荷蘭國旗

pardon110發表於2021-01-05

題面

給定一個包含紅色、白色和藍色,一共 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 協議》,轉載必須註明作者和本文連結

相關文章