直观的方法:计数排序(桶排序)
// 方法1:计数排序
// 时间复杂度: O(n)
// 空间复杂度: O(k),k为元素的取值范围
func sortColors(nums []int) {
buf := make([]int, 3) // 存放0,1,2三个元素的频率
for _, v := range nums {
buf[v]++
}
k := 0
for i := 0; i < 3; i++ {
for j := 0; j < buf[i]; j++ {
nums[j+k] = i
}
k += buf[i]
}
}
// 方法2: 用3分快排的思路
// 时间复杂度为: O(n)
// 空间复杂度为: O(1)
// 遍历一遍
func sortColors2(nums []int) {
j0 := -1 // [0...j0]==0
j2 := len(nums) //[j2...n-1]==2
i := 0
for i < j2 {
switch nums[i] {
case 1:
i++
case 0:
j0++
nums[j0], nums[i] = nums[i], nums[j0]
i++
case 2:
j2--
nums[i], nums[j2] = nums[j2], nums[i]
}
}
}
提交leetcode,通过
网友评论