75 颜色分类-中等

题目:

给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,**原地**对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。

我们使用整数 012 分别表示红色、白色和蓝色。

必须在不使用库内置的 sort 函数的情况下解决这个问题。

分析:

双指针,加上交换的思想;k指针负责遍历,遇到蓝色2则将其交换到尾部,由j指针从尾部开始维护蓝色2的下标;遇到红色0则交换到头部,由i指针从头部开始维护红色0下标。

// date 2023/11/04
func sortColors(nums []int)  {
    k, ri, bj := 0, 0, len(nums)-1
    for k <= bj {
        if nums[k] == 2 {
            nums[k] = nums[bj]
            nums[bj] = 2
            bj--
        } else if nums[k] == 0 {
            nums[k] = nums[ri]
            nums[ri] = 0
            k++  // 此时 nums[k] 只可能为 1,所以跳过检查
            ri++
        } else {
            k++
        }
    }
}

最后更新于