zoukankan      html  css  js  c++  java
  • Maximum Gap

    Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

    Try to solve it in linear time/space.

    Return 0 if the array contains less than 2 elements.

    You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.

    这题是求排序后的相邻数字之间的最大差.但是题意要求用O(n)的解法和空间来解决,单纯的使用quicksort等方法无法满足复杂度的要求.

    可以考虑桶排序,基数排序等O(n)的排序方法.这里用桶排, 用average gap = (max - min)/(n-1)+1作为桶的大小.这样每个桶内的数组之间的gap不可能超过最大gap.考虑每个桶之间的gap,即前一个桶的最大值和当前桶的最小值之间的差可能成为Maximum Gap.这里的做法是不把最大值,最小值放入桶内,这样比较好的避免了只有两个数字时,只有一个桶或者为等差数列时average gap大于最大gap的情况.

    class Solution(object):
        def maximumGap(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            if not nums or len(nums) < 2:
                return 0
            #first step, find the min and max value
            minVal = nums[0]
            maxVal = nums[0]
            for i in xrange(1,len(nums)):
                minVal = min(minVal, nums[i])
                maxVal = max(maxVal, nums[i])
            #bucket sort, calculate the gap, average gap  between the numbers. the final answer is large than it
            gap = (maxVal - minVal)/(len(nums)-1) + 1
            #initialize the bucket value
            bucket_num = (maxVal - minVal)/gap + 1
            bucket_min = [2**31-1] * bucket_num #32bit signed int
            bucket_max = [0] * bucket_num
            for i in nums:
                if i == minVal or i == maxVal:  #不把最大值和最小值放入桶中
                    continue
                index = (i - minVal)/gap #right postion of the bucket, because the really index must start from 0
                #find each bucket's bottom value and top value
                bucket_min[index] = min(bucket_min[index], i)
                bucket_max[index] = max(bucket_max[index], i)
            previous = minVal
            res = 0
            for j in xrange(bucket_num):
                if bucket_min[j] == 2**31-1 and bucket_max[j] == 0 : continue #防止桶空
                res = max(res, bucket_min[j] - previous)
                previous = bucket_max[j]
            res = max(res, maxVal - previous)
            return res
            
  • 相关阅读:
    unity3D相机缓慢看向目标物体
    设计原则
    unity3D中GUI标题内文字滚动效果
    python3.6中安装PyQt报错
    codeforces 515B.Drazil and His Happy Friends
    HDU 1029 Ignatius and the Princess IV
    POJ 1052 Plato's Blocks
    Uva220 Othello
    uva201 Squares
    uva1587 Box
  • 原文地址:https://www.cnblogs.com/sherylwang/p/5699416.html
Copyright © 2011-2022 走看看