两种方法解决 Sort Color II - with multiple colors k

1. 最直观的方法,把list存成dictionary,key为color,value为color出现的次数,而后循环一个个导出。 

def sortcolor2(colors,k):
    count={}
    for c in colors:
        if c not in count:
            count[c]=0
        else:
            count[c]+=1
    print(count)
    index= 0
    i = 1 
    for i in range(1,k+1):
        while(count[i]>=0):
            colors[index]=i
            index+=1
            count[i]-=1
        i +=1
    
    return colors

时间复杂度为O(N)

2. 另一种方法比较难以理解。我的理解是,计数法。把每个color对应的bucket当成计数。每一次让当前值变成bucket对应的值,bucket值变为-1,表示计数一次。若读到bucket为负数,表示已计数,bucket值减一,当前值也就是color[i]为0。如此到。最后,会得出一个list表示每种color的计数。而后需要倒置导出。时间复杂度为O(nlogK)。确实好难理解啊。做一天僵半天。想知道是怎么想到这样的解法的。

class Solution:
    """
    @param colors: A list of integer
    @param k: An integer
    """
    def sortColors2(self, colors, k):
        # write your code here
        i = 0
        n=len(colors)
        while i<n:
            nums=colors[i]
            if colors[i]>0:
                if colors[nums-1]>0:
                    colors[i]=colors[nums-1]
                    colors[nums-1]=-1
                    i -= 1
                else:
                    colors[nums-1]-=1
                    colors[i]=0
            i +=1
                
        i=len(colors)-1
        k=i
        while i>=0:
    @return: nothing
            if colors[i]<0:
                temp=k+colors[i]

第三种 快排。以后再补。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值