题目从这儿看到的 : https://mp.weixin.qq.com/s/2OXg67MfBuQjDPAJxxD8rQ,但是公众号上有一点讲错了,问题还挺严重的。
题目:有一个无序数组2,3,1,4,6,排序后是1,2,3,4,6,最大差值是 6 - 4 = 2。
- 先找到数组的max和min。
- 创建一个长度为N+1的桶,第一个桶存储最小值,最后一个桶存储最大值。
- 除去第一个和最后一个,也就是N-2个数往N-1个桶里放,那么至少会有一个桶为空。
- 遍历新数组Array,计算每一个非空桶中的最小值,与下一个非空桶的最大值的差,数值最大的差即为原数组排序后的相邻最大差值。(所以,每个桶只需要记录当前桶的最大值、最小值即可)
原公众号文章就是第四步错了:
举个简单的例子就知道是不对的了,最大值并不出现 在空桶的两侧。
代码实现:
int find_Max_Offset(int *a,int length) { int min = getMin(a, length), max = getMax(a, length); if (max == min) return 0; int **bucket = new int*[length + 1]; for (int i = 0; i < length + 1; i++) { bucket[i] = new int[3]; bucket[i][0] = 0; } bucket[0][0] = 1; bucket[0][1] = bucket[0][2] = min; bucket[length][0] = 1; bucket[length][1] = bucket[length][2] = max; for (int i = 1; i < length; i++) { int index = ( a[i] - min) * length / (max - min); if (!bucket[index][0]) { bucket[index][0] = 1; bucket[index][1] = a[i]; bucket[index][2] = a[i]; } else { bucket[index][1] = a[i] > bucket[index][1] ? a[i] : bucket[index][1]; bucket[index][2] = a[i] < bucket[index][2] ? a[i] : bucket[index][2]; } } int offset = 0; for (int i = 0; i < length; i++) { int max = bucket[i++][1]; while (bucket[i][0] == 0) i++; int min = bucket[i][2]; offset = (min - max) > offset ? (min - max) : offset; } return offset; }
原文地址:https://www.cnblogs.com/czc1999/p/10344077.html
时间: 2024-11-10 15:41:41