最近一直在刷leetcode,今天刷到一题:
当时想了一下hash算法,测试虽然通过,但是耗时比较长。你说巧不巧,下午刷左神的算法课提到桶排序,一下子联想起来了。发现桶排序/计数排序完全可以降低时间复杂度。第一次写桶排序,mark一下,防止遗忘。
class Solution:
def relativeSortArray(self, arr1: List[int], arr2: List[int]) -> List[int]:
#首先生成一个桶,用来统计arr1中各个元素出现的字数,同时无形之中已经对列表进行了排序。
#相当与桶的下标就是arr1中的数据,桶中存放的值就是arr1中各个元素出现的次数。
#+1是为了防止列表溢出。因为数组下标从0开始,假如我们要得到arr1中的元素10,那我们的桶的大小必须到11。bucket[10]对应元素10
bucket=[0]*(max(arr1)+1)
#用来存放排完序的数组
res=[]
#对arr1中的元素进行统计并排序
for i in arr1:
bucket[i]+=1
#对arr2中的数据先进性存放,存放完以后将桶排序中对应下标的值置0,表示对应的所有数据已存放代res里面
for j in arr2:
res+=[j for _ in range(bucket[j])]
bucket[j]=0
#将不在arr2中的数据进行排序,然后添加。桶排序的存放已经对arr1进行了排序
for k in range(len(bucket)):
res+=[k for _ in range(bucket[k])]
return res