数组与矩阵---数组排序之后相邻数的最大差值
来源:互联网 发布:买家淘宝违法规则 编辑:程序博客网 时间:2024/06/14 05:50
【题目】
给定一个整型数组arr,返回排序后的相邻两数的最大差值
例如:
arr = [9, 3, 1, 10]。如果排序,结果为[1, 3, 9, 10],9和3的差为最大值,故返回6.
arr = [5, 5, 5, 5]。返回0.
要求时间复杂度O(N).
【基本思路】
利用桶排序的思想(不是直接进行桶排序),可以做到时间复杂度O(N),空间复杂度O(N)。
遍历数组arr,找到最大值max和最小值min。如果数组的长度为N,那么我们准备N+1个桶,把max单独放在第N+1个桶里。arr中[min, max)范围上的数放在1~N号桶里。对于1~N个桶,每个桶负责的区间大小为(max- min) / N。所以对于元素num,它应该被分配进的桶的编号是(num - min) / ((max - min) / N) = (num - min) * N / (max - min),注意:这里的桶的编号是从0开始计数的。
arr一共有N个数,其中min一定会放在1号桶,max一定会放在N+1号桶,所以如果把N个数放入N+1个桶,其中一定有桶是空的。如果arr经过排序,那么差值最大的情况一定发生在空桶的两侧(空桶右侧的最小值 - 左侧的最大值)。所以只要找到所有空桶两侧的差值中的最大值即可。
下面是使用python3.5实现的代码。
def maxGap(arr): def bucket(value, length, maxNum, minNum): return int((value - minNum) * length / (maxNum - minNum)) if arr == None or len(arr) == 0: return 0 length = len(arr) minNum = sys.maxsize maxNum = -sys.maxsize for i in range(len(arr)): minNum = min(minNum, arr[i]) maxNum = max(maxNum, arr[i]) if minNum == maxNum: return 0 hasNum = [False for i in range(length+1)] maxs = [0 for i in range(length+1)] mins = [0 for i in range(length+1)] for i in range(len(arr)): index = bucket(arr[i], length, maxNum, minNum) #算出桶号 maxs[index] = max(maxs[index], arr[i]) if hasNum[index] else arr[i] mins[index] = min(mins[index], arr[i]) if hasNum[index] else arr[i] hasNum[index] = True lastMax = maxs[0] res = 0 for i in range(1, length+1): #计算最大差值 if hasNum[i]: res = max(res, mins[i] - lastMax) lastMax = maxs[i] return res
阅读全文
2 0
- 数组与矩阵---数组排序之后相邻数的最大差值
- 数组排序之后相邻数的最大差值
- 数组排序之后相邻数的最大差值
- 求数组排序后相邻数的最大差值
- 求数组排序后相邻两个数的最大差值
- leetcode:排序数组之后相邻数的最大差
- 数据排序之后相邻数的最大差值
- 排序数组中的相邻两数最大差值
- 无序数组排序后的最大相邻差值求解
- 无序数组的相邻最大差值
- Maximum Gap 寻找数组中排序后相邻两个数的最大差值,桶排序,O(n)
- 求无序数组排序后相邻俩数最大差值(思路及详解)
- 如果给定一个数组arr[0,...N-1],要求找出相邻两个数的最大差值
- 排序17:相邻两数最大差值
- 无序数组相邻最大差值java实现
- 相邻两数的最大差值
- 相邻两数最大差值
- 相邻两数最大差值
- [agc012e]Camel and Oases
- OGNL在Struts2中的应用
- element ui table scrollTop 滚动到行头或行尾
- MySQL UPDATE & DELETE 查询
- oj 时间就是金钱
- 数组与矩阵---数组排序之后相邻数的最大差值
- Quasi-palindrome
- 常用的SQL语句大全-多表操作
- docker 端口映射
- 西南交通大学第十三届校赛 CPaint Box 逆元预处理
- python3.5《机器学习实战》学习笔记(三):k近邻算法scikit-learn实战手写体识别
- linux下find(文件查找)命令的用法总结
- Python数字与字符转换
- 房价