求数组相邻元素差值的最大值快速算法(C++版)
2015-11-23 23:49
337 查看
题目:
整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。
给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。
思路:
基于桶排序思想 n个数 n+1个桶 最后一个桶存最大数 那么最大差值一定在非空桶的相邻2个桶之间 且=(空桶右边 min -
空桶左边max)
算法复杂度:
时间复杂度:O(n)
空间复杂度:O(n)
贴代码:
输出:
2
整形数组A,请设计一个复杂度为O(n)的算法,算出排序后相邻两数的最大差值。
给定一个int数组A和A的大小n,请返回最大的差值。保证数组元素多于1个。
思路:
基于桶排序思想 n个数 n+1个桶 最后一个桶存最大数 那么最大差值一定在非空桶的相邻2个桶之间 且=(空桶右边 min -
空桶左边max)
算法复杂度:
时间复杂度:O(n)
空间复杂度:O(n)
贴代码:
<span style="white-space:pre"> </span>// 计算桶号(/第几号桶) int calBucketNum(long val, long len, long minVal, long maxVal) { return (int) ((val - minVal) * len / (maxVal - minVal)); } int getMin(int a, int b) { return (a < b) ? a : b; } int getMax(int a, int b) { return (a > b) ? a : b; } // 桶排序思想 int maxGap(vector<int> A, int n) { if(A.size() < 2) { return 0; } int min = A[0], max = A[0]; for(int i = 1; i < n; ++i) { min = (min > A[i]) ? A[i] : min; max = (max < A[i]) ? A[i] : max; } // 最大值和最小值相等 返回0 if(min == max) { return 0; } vector<bool> notEmpty(n + 1, false); // 桶是否为空桶 vector<int> maxs(n + 1, 0); // 每个桶的最大值 vector<int> mins(n + 1, 0); // 每个桶的最小值 // 桶号 int bucketNum = 0; // 遍历数组元素 将其放入相应桶中 for(int i = 0; i < n; ++i) { // 得到这个元素应该放在哪个桶 bucketNum = calBucketNum(A[i], n, min, max); mins[bucketNum] = notEmpty[bucketNum] ? (getMin(mins[bucketNum], A[i])) : A[i]; maxs[bucketNum] = notEmpty[bucketNum] ? (getMax(maxs[bucketNum], A[i])) : A[i]; notEmpty[bucketNum] = true; // 该桶不为空 } // cnt —— 遍历到第几个桶 int cnt = 0, mx = 0; // 遍历n+1个桶 while(cnt <= n) { // 找到第一个非空桶 if(notEmpty[cnt]) { mx = maxs[cnt]; break; } cnt++; } int maxgap = 0; // 待求的差值最大值一定出现在空桶附近的相邻2个桶之间 while(cnt <= n) { if(notEmpty[cnt]) { maxgap = getMax(maxgap, mins[cnt] - mx); mx = maxs[cnt]; } cnt++; } return maxgap; }测试函数:
int main(void) { int a[] = {1,2,5,4,6}; int len = sizeof(a) / sizeof(int); vector<int> v(a, a + len); Gap g; cout<<g.maxGap(v, len); return 0; }
输出:
2
相关文章推荐
- strlen函数实现——string.h库函数
- c语言:分别使用for循环和while循环求5!
- 面试之C++题目汇总7
- c语言:输出(Welcome??)和(Welcome\?\?)
- 面试之C++题目汇总6
- 使用Java中的JNI技术将C/C++程序嵌入到Java代码中实现Hello World
- 面试之C++题目汇总5
- 面试之C++面试题汇总4
- 面试之C++面试题汇总3
- c语言:有趣的转义字符用法
- c语言:对于一个变量n,const用法和指针的比较
- How to call C/C++ sytle function from C# solution?
- 面试之C++题目汇总2
- 面试之C++题目汇总
- traincascade.cpp
- c语言:在屏幕上输出单引号和双引号
- c语言:枚举常量的用法举例
- TLD学习(2)-调试lk.cpp
- C#中调用c++的dll
- c语言:求字符串的字节数,strlen