题目:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且要求不能用非基于比较的排序。
解题思路:借助桶排序
//
// Created by yzm on 11/12/18.
//
#include <iostream>
#include <algorithm>
#include<vector>
using namespace std;
class MaxGap {
public:
/**
* 题目:求数组A排序后相邻两数的最大差值,不能用非基于比较的排序,且时间复杂度为O(N)
* tips: 借助通排序
*
* */
int maxGap(vector<int> &arr);
private:
int bucket(int &num,int &len,int min, int max);
};
int MaxGap::maxGap(vector<int> &arr) {
int len = arr.size();
int _max = *max_element(arr.begin(),arr.end());
int _min = *min_element(arr.begin(),arr.end());
//step1:找到最大值与最小值,如果相同则返回0
if(_max == _min)
return 0;
//step2: 建立三个桶
vector<bool> isNum(len + 1);
vector<int> maxs(len + 1);
vector<int> mins(len + 1);
int index = 0;
for(int i = 0; i < len;i++){
index = bucket(arr[i],len, _min,_max);
mins[index] = isNum[index] ? min(mins[index] ,arr[i]) :arr[i];//找出每个桶的最大值与最小值
maxs[index] = isNum[index] ? max(maxs[index] ,arr[i]) : arr[i];
isNum[index] = true;
}
//step3:
int gap = 0;
int lastMax = maxs[0];
int i=1;
for(; i <= len; i++){
if(isNum[i])
{
gap = max(gap, mins[i] - lastMax);
lastMax = maxs[i];
}
}
return gap;
}
int MaxGap::bucket(int &num, int &len, int min, int max) {
int index = ((num -min) * len / (max -min));
return index;
}
int main()
{
MaxGap p;
vector<int> arr={0 ,3 ,1 ,8 ,9 ,1 ,2};
int a=p.maxGap(arr);
cout << "maxgap:"<< a << endl;
return 0;
}