数组与矩阵---数组排序之后相邻数的最大差值
2017-09-23 11:21
267 查看
【题目】
给定一个整型数组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实现的代码。
给定一个整型数组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
相关文章推荐
- 数组排序之后相邻数的最大差值
- [算法]数组排序之后相邻数的最大差值
- 数组排序之后相邻数的最大差值
- 数据排序之后相邻数的最大差值
- leetcode:排序数组之后相邻数的最大差
- 求数组排序后相邻数的最大差值
- 给定一个无序数组,排序之后求相邻两数之间的最大差值
- 求无序数组排序后相邻俩数最大差值(思路及详解)
- 排序数组中的相邻两数最大差值
- 给定一个无序数组,求这组数在排序后相邻数间差的最大值
- 求排序后数组中的最大差值
- Maximum Gap 寻找数组中排序后相邻两个数的最大差值,桶排序,O(n)
- 桶---求无序数组排序后,最大的相邻差值
- 数据结构之——找到无序数组中排序后相邻元素差值的最大值
- 无序数组排序后的最大相邻差值
- 无序数组排序后的最大相邻差值求解
- 无序数组排序后的最大相邻差值
- 求无序数组排序后相邻两个数的最大差值
- 求数组排序后相邻两个数的最大差值
- 剑指offer 机器人的运动范围 矩阵中的路径 滑动窗口最大值 次数超过一半的数 连续子数组的最大和