LintCode 400: Maximum Gap (bucket sort经典题!)

本文介绍了一种在O(n)时间和空间复杂度内寻找数组中最大元素间隔的方法。通过将数组分为若干个桶(bucket),并利用桶排序的思想来高效地解决此问题。
  1. 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
Given [1, 9, 2, 5], the sorted form of it is [1, 2, 5, 9], the maximum gap is between 5 and 9 = 4.

Challenge
Sort is easy but will cost O(nlogn) time. Try to solve it in linear time and space.

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

解法1:bucket sorting
这题我想了半天,什么双指针,单调栈,DP都想了,最后觉得如果要时间复杂度和空间复杂度都是O(n)的话只能用类似bucket sort之类的方法。
首先是找到min和max,然后将其分成k份。这个k有讲究,不能超过n,但是也不能小于maxV-minV。所以取min(n, maxV-minV)。假如maxV-minV很小,则所有元素都挤在几个数上,那么最多也只能有maxV-minV个buckets。
然后我们分析一下就可以知道,相邻元素间隔最大值只可能是某个bucket的最大元素和下一个bucket的最小元素。那么为什么不可能是某个bucket里面的两个元素呢?因为我们将n个元素分到<=n个buckets里面,所以某个bucket最多分到一个元素!
那么可不可以分maxV-minV+1个buckets呢?可能可以,没有试。

注意:

  1. 特殊情况:
    a. 所有元素均相同 [1,1,1,1,1,1,1],此时返回0即可。
    b. 最大元素比最小元素大1 [1,1,1,1,1,2,1,1],此时返回1即可。因为maxV-minV=1,只能有1个bucket,下面的代码不适用。
  2. 因为map的原则都是往最近的大于等于该元素的bucket去map,最大的那个元素要特殊处理,应该map到bucket[bucketNum - 1]。
    代码如下:
struct bucketType {
    int count;
    int minNum;
    int maxNum;
    bucketType(int c = 0, int minV = INT_MAX, int maxV = 0) : count(c), minNum(minV), maxNum(maxV) {}
};

class Solution {
public:
    /**
     * @param nums: an array of integers
     * @return: the maximun difference
     */
    int maximumGap(vector<int> &nums) {
        int n = nums.size();
        if (n < 2) return 0;
        
        int minV = INT_MAX, maxV = INT_MIN;
        
        for (int i = 0; i < n; ++i) {
            minV = min(minV, nums[i]);
            maxV = max(maxV, nums[i]);
        }
        
        //special case [1,1,1,2,1,1], [1,1,1,1,1,1]
        if (maxV - minV <= 1) return maxV - minV; 
        
        int bucketNum = min(n, maxV - minV);   //important!!!
        int bucketLen = (maxV - minV) / bucketNum;
        vector<bucketType> buckets(bucketNum);
        
        // the buckets are [ ) range
        for (int i = 0; i < n; ++i) {
            int index = (nums[i] - minV) / bucketLen;
            if (index >= bucketNum) index = bucketNum - 1;
  
            buckets[index].count++;
            buckets[index].maxNum = max(buckets[index].maxNum, nums[i]);
            buckets[index].minNum = min(buckets[index].minNum, nums[i]);
        }

        int maxDist = 0;
        int lastElem = buckets[0].maxNum;
        for (int i = 1; i < bucketNum; ++i) {
            if (buckets[i].count == 0) continue;
            maxDist = max(maxDist, buckets[i].minNum - lastElem);
            lastElem = buckets[i].maxNum;
        }
        return maxDist;
    }
};
需求响应动态冰蓄冷系统与需求响应策略的优化研究(Matlab代码实现)内容概要:本文围绕“需求响应动态冰蓄冷系统与需求响应策略的优化研究”展开,基于Matlab代码实现,重点探讨了冰蓄冷系统在电力需求响应背景下的动态建模与优化调度策略。研究结合实际电力负荷与电价信号,构建系统能耗模型,利用优化算法对冰蓄冷系统的运行策略进行求解,旨在降低用电成本、平衡电网负荷,并提升能源利用效率。文中还提及该研究为博士论文复现,涉及系统建模、优化算法应用与仿真验证等关键技术环节,配套提供了完整的Matlab代码资源。; 适合人群:具备一定电力系统、能源管理或优化算法基础,从事科研或工程应用的研究生、高校教师及企业研发人员,尤其适合开展需求响应、综合能源系统优化等相关课研究的人员。; 使用场景及目标:①复现博士论文中的冰蓄冷系统需求响应优化模型;②学习Matlab在能源系统建模与优化中的具体实现方法;③掌握需求响应策略的设计思路与仿真验证流程,服务于科研项目、论文写作或实际工程方案设计。; 阅读建议:建议结合提供的Matlab代码逐模块分析,重点关注系统建模逻辑与优化算法的实现细节,按文档目录顺序系统学习,并尝试调整参数进行仿真对比,以深入理解不同需求响应策略的效果差异。
综合能源系统零碳优化调度研究(Matlab代码实现)内容概要:本文围绕“综合能源系统零碳优化调度研究”,提供了基于Matlab代码实现的完整解决方案,重点探讨了在高比例可再生能源接入背景下,如何通过优化调度实现零碳排放目标。文中涉及多种先进优化算法(如改进遗传算法、粒子群优化、ADMM等)在综合能源系统中的应用,涵盖风光场景生成、储能配置、需求响应、微电网协同调度等多个关键技术环节,并结合具体案例(如压缩空气储能、光热电站、P2G技术等)进行建模与仿真分析,展示了从问建模、算法设计到结果验证的全流程实现过程。; 适合人群:具备一定电力系统、能源系统或优化理论基础,熟悉Matlab/Simulink编程,从事新能源、智能电网、综合能源系统等相关领域研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①开展综合能源系统低碳/零碳调度的科研建模与算法开发;②复现高水平期刊(如SCI/EI)论文中的优化模型与仿真结果;③学习如何将智能优化算法(如遗传算法、灰狼优化、ADMM等)应用于实际能源系统调度问;④掌握Matlab在能源系统仿真与优化中的典型应用方法。; 阅读建议:建议结合文中提供的Matlab代码与网盘资源,边学习理论模型边动手调试程序,重点关注不同优化算法在调度模型中的实现细节与参数设置,同时可扩展应用于自身研究课中,提升科研效率与模型精度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值