今天正好做到这个排序题了,需要用到O(N)复杂度的桶排序或者基数排序,正好学习下这两种排序。在学习过程中,还遇到了排序稳定性这样的概念,也可小小总结一下。
解法一:基数排序,复杂度O(K(M+N))
此解法是把一个元素分成单位?比如生日可以分成年,月份和日期,然后对这三个按顺序排序。基数排序也是这样很妙的原理,每次对数字的一位进行排序,从个位到最高位,所有位排好就ok了。注意,由于高位优先级最高,所以高位的排序应该放在后面。此算法复杂度为O(K(M+N)),其中K为关键字个数,M为关键字取值范围,即桶的个数。
class Solution:
def maximumGap(self, nums: List[int]) -> int:
if len(nums) < 2: return 0
def get_digit(num, base):
num = num % base
return int(num / (base/10))
base = 1
while True:
bucket = [[] for _ in range(10)]
base *= 10
# put
for num in nums:
bucket[get_digit(num, base)].append(num)
# collect
tmp_nums = []
for i in range(0, 10):
tmp_nums.extend(bucket[i])
# check
ok = 1
for i in range(len