leetcode164.Maximum Gap

来源:互联网 发布:ai软件工具栏功能 编辑:程序博客网 时间:2024/06/05 11:02

Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Try to solve it in linear time/space.

Return 0 if the array contains less than 2 elements.

You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.

解法:

桶排序,首先找到数组的最大值和最小值,然后设置gap为最大值和最小值的差距除以数组长度,那么我们所需要找到的max值则可以通过遍历每个桶,求当前桶的最大值和下一个桶的最小值的差距,这个差距的最大值即为所求。

代码:

class Solution {public:    int maximumGap(vector<int>& nums) {        if(nums.size() < 2)            return 0;        if(nums.size() == 2)            return abs(nums[0]-nums[1]);        int maxnum = nums[0];        int minnum = nums[0];        for(int i = 0; i < nums.size(); i ++)        {            maxnum = max(maxnum, nums[i]);            minnum = min(minnum, nums[i]);        }        int gap = ceil((double)(maxnum-minnum)/nums.size());        if(gap == 0)            return 0;        int len = (maxnum-minnum)/gap+1;        int maxi[len];        int mini[len];        for(int i = 0; i < len; i ++)        {            maxi[i] = minnum;            mini[i] = maxnum;        }        int rank = 0;        for(int i = 0; i < nums.size(); i ++)        {            rank = (nums[i] - minnum) / gap;            maxi[rank] = max(maxi[rank],nums[i]);            mini[rank] = min(mini[rank],nums[i]);        }        int ans = 0;        int tempmax = maxi[0];        for(int i = 1; i < len; i ++)        {            if(maxi[i] == minnum && mini[i] == maxnum)                continue;            else            {                ans = max(ans,(mini[i]-tempmax));                tempmax = maxi[i];            }            // ans = max(ans, (mini[i]-maxi[i-1]));        }        return ans;    }};

注意:

1 gap可能为0
2 有的桶可能为空,所以不能简单的下一个桶的最小值减去当前桶的最大值。

原创粉丝点击