您的位置:首页 > 其它

[Leecode] Maximum Gap

2016-02-02 20:08 288 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode