知道的越多,不知道的越多(微信:Y17744650906)
点赞再看,养成习惯
164. 最大间距
正文
桶排序的两个核心问题:
每个桶的长度是多少?换句话说,每个桶放置元素的范围是什么?
一共要准备多少个桶?
分析和解答:
我们期望将数组中的各个数等距离分配,也就是每个桶的长度相同,也就是对于所有桶来说,桶内最大值减去桶内最小值都是一样的。可以当成公式来记。
每个桶的长度 = (max - min) // ( len(nums) -1 )
确定桶的数量,最后的加一保证了数组的最大值也能分到一个桶。
桶的数量 = ( max - min ) // 桶的长度 + 1(加1保证最后一个元素放在桶里)
我们的做法是要将数组中的数放到一个个桶里面,不断更新更大的(后一个桶内元素的最小值 - 前一个桶内元素的最大值),最后就得到了答案。
如何确定每个数应该对应哪个桶?
每个元素所放的桶 = (nums[i] - min )// 桶的长度
举个栗子
nums = [1,3,4,5,6,10,11,12,17]
每个桶的长度 = (17 - 1) / (9-1) = 2
桶的个数 = (17-1)/ 2 + 1 = 9
所以我们的桶为(左闭右开):
区间 [1,3) [3,5) [5,7) [7,9) [9,11) [11,13) [13,15) [15,17) [17,19)
元素 1 3,4 5,6 10 11,12 17
差值 3-1 = 2 5-4 = 1 10-6 = 4 11-10 = 1 17-12 = 5
答案 = max(差值) = 5
class Solution:
def maximumGap(self, nums: List[int]) -> int:
if not nums or len(nums) < 2: return 0
max_gap = 0
min_ = min(nums)
max_ = max(nums)
each_bucket_len = max(1,(max_ -min_) // (len(nums) - 1)) #每个桶的长度
buckets =[[] for _ in range((max_-min_) // each_bucket_len + 1)]
for i in range(len(nums)):
loc = (nums[i] - min_) // each_bucket_len
buckets[loc].append(nums[i])
pre_max = -1
for i in range(len(buckets)):
if buckets[i] and pre_max != -1:
max_gap = max(max_gap , min(buckets[i]) - pre_max)
if buckets[i]:
pre_max = max(buckets[i])
return max_gap