每天两道LeetCodeHard:(27)

151 阅读1分钟

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

答案补充: