leetcode 相邻元素之间最大的差值-python

在保持线性时间和空间复杂度的限制下,解决LeetCode中的一道问题,找出无序数组在排序后的相邻元素最大差值。通过使用桶排序策略,避免直接排序,以达到高效解题的目的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目说明:

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。

如果数组元素个数小于 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个桶中:
  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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值