164. Maximum Gap
累加和
题干:
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.
Return 0 if the array contains less than 2 elements.
解释:
时间要求是一次遍历,找到它排序之后的相邻两个数之间最大的差。
思考:
这个题并不难,难的是如何在On内实现排序。这个的确没想出来,书上也没教,看了答案才知道这个有专门的算法叫桶排序,首先考虑n个元素,有序,并且间距相同,那么最大的差毫无疑问就是间距。那么在这种情况下,任意移动任意的元素,由于总和不变,必定会出现差值超过平均值的差,因此我们只要假设桶之间的间距为平均值,最大差的两个值一定是在相邻的两个桶内,而桶之间的差是根据前桶的最大值和后桶的最小值决定的,因此算法简化为: 1,先求最大和最小 2,求桶宽 3,遍历桶,求最大差值。 一共遍历3次,复杂度On。
答案:
class Solution(object):
def maximumGap(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums)<2:
return 0
min_val,max_val,n = float('inf'),float('-inf'),len(nums)
for i in range(n):
if nums[i]<min_val:
min_val=nums[i]
if nums[i]>max_val:
max_val=nums[i]
if min_val==max_val:
return 0
#用两个数组来代表桶,下标代表桶的index
mins=[0]*(n+1)
maxs=[0]*(n+1)
has_num=[False]*(n+1)
for num in nums:
#使用比例确定当前数字存入哪个桶
index=int((num-min_val) * n / (max_val-min_val))
mins[index]=num if not has_num[index] else min(mins[index],num)
maxs[index] = num if not has_num[index] else max(maxs[index], num)
has_num[index] = True
max_len=0
m=maxs[0]
for i in range(1,n+1):
if has_num[i]:
currLen = mins[i]-m
if currLen>max_len:
max_len=currLen
m=maxs[i]
return max_len