Go算法

(7)Go用三路快排思路解决颜色分类问题

2019-05-14  本文已影响0人  哥斯拉啊啊啊哦
直观的方法:计数排序(桶排序)
// 方法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,通过

上一篇 下一篇

猜你喜欢

热点阅读