题目描述
给定一个数组, 求如果排序之后, 相邻两数的最大差值, 要求时间复杂度O(N), 且要求不能用非基于比较的排序。
解法1:暴力法
题目要求时间复杂度为O(N),这意味着我们不能用基于比较的排序方法对数组做排序,因为最快也是O(NlogN)的,但还是做了一下。
方法就是排序了之后用后一个数减前一个数,更新maxGap的值就好了
解法2:利用桶的思想但不排序
这里,数组有N个数,就分N+1个桶,整个解法并不涉及排序
用三个数组记录每个桶的信息(最大值、最小值、是否有数)
最后,利用解法1的思想,求出所有当前桶的最小值和左边桶的最大值之差的最大值,即maxGap
测试结果及代码
#include <iostream>
#include <stdlib.h>
#include <vector>
#include <algorithm>
#include <queue>
#include <climits>
using namespace std;
void printVector(vector<int> A) {
for (const auto &i : A) {
cout << i << " ";
}
}
void Swap(int &x, int &y) {
int t = x;
x = y;
y = t;
}
void compare(vector<int> &a) {
int maxGap = INT_MIN;
if (a.size() < 2) {
cout << a[0] << " ";
maxGap = 0;
}
else {
sort(a.begin(), a