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
            
  • 相关阅读:
    图书管理系统(spring springmvc)
    ssm框架整合(java个人博客系统)
    HTTP笔记
    (数据结构课程设计)稀疏矩阵运算器
    数据库学习笔记
    HTML5 3D旋转图片相册
    Mybatis分页插件-PageHelper的使用
    如何更改github工程的语言属性
    HttpServletResponse和HttpServletRequest详解
    node js 安装.node-gyp/8.9.4 权限 无法访问
  • 原文地址:https://www.cnblogs.com/sherylwang/p/5699416.html
Copyright © 2011-2022 走看看