题目说明:
给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。
如果数组元素个数小于 2,则返回 0。
示例 1:
输入: [3,6,9,1] 输出: 3 解释: 排序后的数组是 [1,3,6,9], 其中相邻元素 (3,6) 和 (6,9) 之间都存在最大差值 3。
示例 2:
输入: [10] 输出: 0 解释: 数组元素个数小于 2,因此返回 0。
说明:
- 你可以假设数组中所有元素都是非负整数,且数值在 32 位有符号整数范围内。
- 请尝试在线性时间复杂度和空间复杂度的条件下解决此问题。
一般思路:先把数组进行排序,再比较相邻元素的差值,求最大的。但是这样做没法满足题目的时间复杂度要求
class Solution(object):
def maximumGap(self, nums):
if len(nums)<2:
return 0
self.quicksort(nums,0,len(nums)-1)
gap=nums[1]-nums[0]
for i in range(2,len(nums)):
temp=nums[i]-nums[i-1]
if temp>gap:
gap=temp
return gap
def quicksort(self,nums,left,right):
if left>=right:
return
low=left
high=right
key=nums[low]
while left<right:
while left<right and nums[right]>key:
right-=1
nums[left]=nums[right]
while left<right and nums[left]<key:
left+=1
nums[right]=nums[left]
nums[right]=key
self.quicksort(nums,low,left-1)
self.quicksort(nums,left+1,high)
思路二:利用桶,对元素进行大致的排序。
- 找出最大值max,最小值min,如果两者相等,则距离显然为0
- 将这n个元素分配到n+1个桶中:
- 每个桶的大小(max-min)/(n+1),将数组中的元素放在对应的桶中,注意,此处最小值一定在0桶,最大值需要单独处理,放在n桶里。另外,找元素对应的桶号时,应该避免过多的除法,降低精度损失
- n+1桶处理,放置完所有元素后,至少会存在一个空桶,最大间隙必然会出现在空桶的两边的数的差距,即:空桶前一个非空桶的最大值 空桶后一个非空桶的最小值之间。对于存在多个空桶,我们需要进行遍历,取这些差距zh的最大值
class Solution(object):
def maximumGap(self, nums):
if len(nums)<2:
return 0
n=len(nums)
max1=max(nums)
min1=min(nums)
w=(max1-min1)
a=[]
for i in range(0,n+1):
a.insert(i,[])
for x in nums:
if x==max1:#最大数放在最后一个桶,因为桶区间是左闭右开,不加此条件,会再加一个桶放最大值
a[n].append(x)
else:
index=(x-min1)*(n+1)//w
a[index].append(x)
temp=[]
for i in range(0,len(a)):
if not a[i] and a[i-1]:
for j in range(i,len(a)):#此处是为了防止连着两个空桶,e.g.1,3,100
if a[j]:
temp.append(min(a[j])-max(a[i-1]))
break#找到第一个非空桶就结束
return max(temp)