[Leecode] Maximum Gap

Maximum Gap

Problem:
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.

题意很清晰,要找出最大的gap,但是是顺序序列最大的gap。由于要求线性时间,很容易想到算法导论中说的线性时间排序算法:Counting Sort, Radix Sort 和 Bucket Sort。题目中还有一个提示,序列中每个元素都是32 bits 的 positive integer,所以,我想用基数排序应该是比较恰当的。
基数排序的时间复杂度如下,

O(d(n+k))
其中, d 是d个digits,k是digit的种类数,例如[0-9]就是10个。
而本题中,我把一个int分成8份,每分4个bits,也就是16进制。那么,算法复杂度为:
O(8(n+16))

算法实现如下,

# Max Gap
# Based on Radix Sort

class Solution(object):
    def maximumGap(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) <= 1:
            return 0

        # Radix Sort
        # Each integer is 32 bits. I divided each int into 8 parts, each part 4 bits.
        # Time: O(32/4 *(n+2^4)) = O(8*(n+16)) = O(n)
        for x in xrange(0,8):
            d = 15 << 4*x   # filter, choose which bits would be sorted
            bucket = [[] for m in xrange(16)]
            for num in nums:
                b = (num & d) >> 4*x    # filtering the parts of bits
                bucket[b].append(num)   # map to bucket
            nums = []   # clear
            for section in bucket:
                nums += section     # reordered

        # Find max gap
        gap = 0
        for i in xrange(1, len(nums)):
            gap = max(gap, nums[i] - nums[i-1])
        return gap
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值