zoukankan      html  css  js  c++  java
  • 164. Maximum Gap

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

    Return 0 if the array contains less than 2 elements.

    Example 1:

    Input: [3,6,9,1]
    Output: 3
    Explanation: The sorted form of the array is [1,3,6,9], either
                 (3,6) or (6,9) has the maximum difference 3.

    Example 2:

    Input: [10]
    Output: 0
    Explanation: The array contains less than 2 elements, therefore return 0.

    Note:

    • You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.
    • Try to solve it in linear time/space.

    AC code:

    class Solution {
    public:
        int maximumGap(vector<int>& nums) {
            int len = nums.size();
            if (len < 2) return 0;
            int minn = nums[0];
            int maxx = nums[0]; 
            for (int i = 1; i < len; ++i) {
                minn = min(minn, nums[i]);
                maxx = max(maxx, nums[i]);
            }
            int gaps = (int)ceil((double)(maxx - minn) / (len-1));  // the numbers of burket
            vector<int> gap_min(len-1, INT_MAX);
            vector<int> gap_max(len-1, INT_MIN);
            for (int i = 0; i < len; ++i) {
                if (nums[i] == minn || nums[i] == maxx)
                    continue;
                int idx = (nums[i] - minn) / gaps;
                gap_min[idx] = min(gap_min[idx], nums[i]);
                gap_max[idx] = max(gap_max[idx], nums[i]);
            }
            int maxdis = INT_MIN;
            int prev = minn;
            for (int i = 0; i < len-1; ++i) {
                if (gap_min[i] == INT_MAX && gap_max[i] == INT_MIN)
                    continue;
                maxdis = max(maxdis, gap_min[i] - prev);
                prev = gap_max[i];
            }
            maxdis = max(maxx-prev, maxdis);
            return maxdis;
        }
    };
    

    Runtime: 8 ms, faster than 56.67% of C++ online submissions for Maximum Gap.

    Analylis:

    step1:

    calculating numbers between the min number and the max number in the array. 

    step2:

    using gaps buckets to equallt distributed the numbers.

    step3:

    find the max and min numbers in each buckets.

    step4:

    the maximum gap is max(gaps, buckets[i]'s min_number - buckets[i-1]'s max_number);

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    03:矩形分割 (二分)
    09:膨胀的木棍 (二分+角度计算)
    A Cubic number and A Cubic Number (二分) HDU
    B
    08:不重复地输出数 (set)
    10:河中跳房子 (二分)
    07:和为给定数 (二分)
    04:网线主管 (二分)
    河中跳房子
    010:输出前k大的数
  • 原文地址:https://www.cnblogs.com/h-hkai/p/9874884.html
Copyright © 2011-2022 走看看