数组排序相邻元素的最大差值

题目:给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度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;
}

猜你喜欢

转载自blog.csdn.net/qq_40028201/article/details/84570241