zoukankan      html  css  js  c++  java
  • LeetCode-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.

    题目大意

    给定一个乱序数组,要求找到该数组在有序情况下相邻两数字最大差值。

    要求:在O(n)时间复杂度以及空间复杂度内完成。

    示例

    E1

    Input: [3,6,9,1]
    Output: 3

    E2

    Input: [10]
    Output: 0

    解题思路

    最简单的方法是先将数组排序,再遍历一遍可得到最后结果。

    感谢LeetCode@zkfairytale的代码得到效率更好的代码。

    由于最终结果的差值大小一定 >= bucket_size = (max - min) / (n - 1),其中max为数组中最大值,min为最小值,n为数组元素个数,可将所有数字分配在各个大小为bucket_size的桶中。由上述条件可知,最终结果一定大于等于bucket_size,因此可以遍历两个相邻bucket之间的最大值与最小值来获得可能的最大的差值。

    复杂度分析

    时间复杂度:O(n)

    空间复杂度:O(n)

    代码

    class Solution {
    public:
        int maximumGap(vector<int>& nums) {
            int n = nums.size();
            if(n < 2)
                return 0;
            int maxn = INT_MIN, minn = INT_MAX, gap = 0;
            //寻找数组中的最大值与最小值
            for(int num : nums) {
                maxn = max(maxn, num);
                minn = min(minn, num);
            }
            //计算bucket的长度大小
            gap = (int)ceil((double)(maxn - minn) / (n - 1));
            
            vector<int> bucketMax(n - 1, INT_MIN);
            vector<int> bucketMin(n - 1, INT_MAX);
            //保存每个归属于该bucket中的数值的最大值与最小值
            for(int num : nums) {
                if(num == minn || num == maxn)
                    continue;
                int idx = (num - minn) / gap;
                bucketMax[idx] = max(bucketMax[idx], num);
                bucketMin[idx] = min(bucketMin[idx], num);
            }
            
            int ans = INT_MIN, pre = minn;
            //寻找相邻两个bucket之间的可能的最大差值
            for(int i = 0; i < n - 1; i++) {
                if(bucketMax[i] == INT_MIN || bucketMin[i] == INT_MAX)
                    continue;
                ans = max(ans, bucketMin[i] - pre);
                pre = bucketMax[i];
            }
            //判断最后两个bucket之间的最大差值
            ans = max(ans, maxn - pre);
            
            return ans;
        }
    };
  • 相关阅读:
    nodejs REPL清屏
    flask 的relationship使用
    flask 数据库多对多(文章和标签)
    设置管理员的 蘑菇丁日报 周报、月报
    访问个人主页、蘑菇丁、使用:import urllib.request
    使用requests访问、登录蘑菇丁
    UUID
    爬虫经典案例
    selenium 获取 cookies, 然后登录
    用chrome浏览器登录以后 手动找到cookie、加到自己的python代码中
  • 原文地址:https://www.cnblogs.com/heyn1/p/10949720.html
Copyright © 2011-2022 走看看