75 颜色分类-中等
题目:
给定一个包含红色、白色和蓝色、共 n
个元素的数组 nums
,**原地**对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
我们使用整数 0
、 1
和 2
分别表示红色、白色和蓝色。
必须在不使用库内置的 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++
}
}
}
最后更新于