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,而本题中,我把一个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