题目描述
请设计一个复杂度为O(n)的算法,计算一个未排序数组中排序后相邻元素的最大差值。
给定一个整数数组A和数组的大小n,请返回最大差值。保证数组元素个数大于等于2小于等于500。
测试样例:
[9,3,1,10],4
返回:6
简单题
使用sort进行排序,时间复杂度非O(n)
# -*- coding:utf-8 -*-
class MaxDivision:
def findMaxDivision(self, A, n):
# write code her
A.sort()
maxx = -0x3f3f3f3f
for i in range(1, n):
if abs(A[i - 1] - A[i]) > maxx:
maxx = abs(A[i - 1] - A[i])
return maxx
if __name__ == "__main__":
a = MaxDivision()
print a.findMaxDivision([9,3,1,10],4)
使用桶排序,时间复杂度为O(n)
桶排序的实现步骤:
1.找出最大值和最小值。
2.生成一个最大值-最小值的区间 比如最大值9,最小值3,那就需要7个桶
3.往里面填
4.查找空桶,最多的即为最大差值。
# -*- coding:utf-8 -*-
class MaxDivision:
def findMaxDivision(self, A, n):
# write code her
minn = min(A)
maxx = max(A)
# 生成桶
res = [0 for i in range(maxx - minn + 1)]
# 填桶
for i in range(n):
res[A[i] - minn] += 1
count = 0
num = -0x3f3f3f3f
for i in range(len(res)):
if res[i] == 0:
# 如果说当前的桶为空,则记录下来连续的空桶数
count += 1
else:
if num < count:
num = count
count = 0
# 为何加1?举例如下:最大值为9,最小值为3,中间有5个空桶,但差值应为6
return num + 1
if __name__ == "__main__":
a = MaxDivision()
print a.findMaxDivision([9,3,1,10],4)