桶排序 -- 相邻最大差值,Maximum Gap(leetcode)

来源:互联网 发布:淘宝运费险怎么赔付25 编辑:程序博客网 时间:2024/05/23 02:00

题目描述

请设计一个复杂度为O(n)的算法,计算一个未排序数组排序后相邻元素的最大差值
给定一个整数数组A和数组的大小n,请返回最大差值。保证数组元素个数大于等于2小于等于500。
测试样例:
[9,3,1,10],4
返回:6
http://www.nowcoder.com/practice/376ede61d9654bc09dd7d9fa9a4b0bcd?tpId=49&tqId=29366&rp=5&ru=/ta/2016test&qru=/ta/2016test/question-ranking

桶排序自行百度,google


桶排序思路求解

class MaxDivision {public:    int findMaxDivision(vector<int> A, int n) {        // write code here        int minn = A[0];        int maxx = A[0];        for (int i = 1; i < n; i++)        {            if (A[i] > maxx)                maxx = A[i];            if (A[i] < minn)                minn = A[i];        }        // 分成maxx-minn+1个区间(桶),每个区间只记录最大最小值        vector<int> vmin(n + 1, maxx);        vector<int> vmax(n + 1, minn);        set<int> notEmpty; // 记录非空桶的下标 共n+1个桶 下标从0到n,避免重复选用了set集合,也能用hash        // 最大数 单独一个桶        vmin[n] = maxx;        vmax[n] = maxx;        notEmpty.insert(n);        // 剩下的n-1个数用n个桶,桶区间大小        double bucket = 1.0 * (maxx - minn) / n;        // 处理每一个A[i]        for (int i = 0; i < n; i++)        {            if (A[i] == maxx)                continue;            int pos = (int)(1.0*(A[i] - minn) / bucket); // 得到元素的下标位置            if (A[i] < vmin[pos])            {                vmin[pos] = A[i];            }            if (A[i] > vmax[pos]){                vmax[pos] = A[i];            }            notEmpty.insert(pos);        }        int rs = 0;        // 对于每个非空桶 其最小值减去前面桶的最大值 就是一个结果        set<int>::iterator it = notEmpty.begin();        int p1 = *it;        it++;        while (it != notEmpty.end())        {            int p2 = *it;            if ((vmin[p2] - vmax[p1]) > rs) // 对比找到结果                rs = (vmin[p2] - vmax[p1]);            p1 = p2;            it++;        }        // 返回结果        return rs;    }};

或如下的ac代码

class MaxDivision {public:    int findMaxDivision(vector<int> A, int n) {        // write code here        int minn = A[0];        int maxx = A[0];        for (int i = 1; i < n; i++)        {            if (A[i] > maxx)                maxx = A[i];            if (A[i] < minn)                minn = A[i];        }        // 分成maxx-minn+1个区间(桶),每个区间只记录最大最小值        vector<int> vmin(n + 1, maxx);        vector<int> vmax(n + 1, minn);        // 最大数 单独一个桶        vmin[n] = maxx;        vmax[n] = maxx;        // 剩下的n-1个数用n个桶,桶区间大小        double bucket = 1.0 * (maxx - minn) / n;        // 处理每一个A[i]        for (int i = 0; i < n; i++)        {            if (A[i] == maxx)                continue;            int pos = (int)(1.0*(A[i] - minn) / bucket); // 得到元素的下标位置            if (A[i] < vmin[pos])            {                vmin[pos] = A[i];            }            if (A[i] > vmax[pos]){                vmax[pos] = A[i];            }        }        int rs = 0;        // 对于每个非空桶 其最小值减去前面桶的最大值 就是一个结果        int pre = 0; // 最小的那个值在第0号桶中        for (int i = 1; i <= n;i++)        {            if (vmin[i] == maxx && vmax[i] == minn) // 表示这是个空桶                continue;            if ((vmin[i] - vmax[pre]) > rs) // 对比找到结果                rs = (vmin[i] - vmax[pre]);            pre = i;        }        // 返回结果        return rs;    }};

牛客网解答
http://www.nowcoder.com/questionTerminal/376ede61d9654bc09dd7d9fa9a4b0bcd

其中有把桶区间长度就设为1的,其实就变成了排序了,或者hash了(用数组表示hash也是常用的一种方法)


Maximum Gap(leetcode)

题目地址:
https://leetcode.com/problems/maximum-gap/

ac代码:

class Solution {public:    int maximumGap(vector<int>& nums) {        int n = nums.size();        if (n < 2)            return 0;        int minn = nums[0];        int maxx = nums[0];        for (int i = 1; i < n; i++)        {            if (nums[i] > maxx)                maxx = nums[i];            if (nums[i] < minn)                minn = nums[i];        }        // 分成maxx-minn+1个区间(桶),每个区间只记录最大最小值        vector<int> vmin(n + 1, maxx);        vector<int> vmax(n + 1, minn);        // 最大数 单独一个桶        vmin[n] = maxx;        vmax[n] = maxx;        // 剩下的n-1个数用n个桶,桶区间大小        double bucket = 1.0 * (maxx - minn) / n;        // 处理每一个元素        for (int i = 0; i < n; i++)        {            if (nums[i] == maxx)                continue;            int pos = (int)(1.0*(nums[i] - minn) / bucket); // 得到元素的下标位置            if (nums[i] < vmin[pos])            {                vmin[pos] = nums[i];            }            if (nums[i] > vmax[pos]){                vmax[pos] = nums[i];            }        }        int rs = 0;        // 对于每个非空桶 其最小值减去前面桶的最大值 就是一个结果        int pre = 0; // 最小的那个值在第0号桶中        for (int i = 1; i <= n; i++)        {            if (vmin[i] == maxx && vmax[i] == minn) // 表示这是个空桶                continue;            if ((vmin[i] - vmax[pre]) > rs) // 对比找到结果                rs = (vmin[i] - vmax[pre]);            pre = i;        }        // 返回结果        return rs;    }};
0 0
原创粉丝点击