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]
第三种 快排。以后再补。