Hard-题目7:42. Trapping Rain Water

本文针对一个经典的算法问题——计算地形图中能储存多少雨水进行了详细解答。通过双指针法,对比两端高度来逐步求解,实现了一次遍历的高效解决方案。

题目原文:
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.

For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
题目大意:
给出n个非负整数数组,其中height[i]代表坐标轴上横坐标为[i,i+1]的矩形的高度,计算这些矩形和x轴围成的“容器”能装多少水。
题目分析:
本题是Middle-题目31的变形,也是用两个指针i和j分别指向数组头和结尾,记两边矩形的高度分别为height[i]和height[j],分两种情况讨论:
(1) height[i]<height[j],则i向右移动,如果后面矩形的高度小于height[i],则其高度差值一定可以装水(因为j那边比i高,不管中间是什么情况,j那侧一定不是“短板”,如果后面矩形的高度大于Height[i],则停止滑动i,因为已经找到一个“杯子”并计算出它的水量了。
(2) height[i]>height[j],同理j向左移动,找到一个高度大于等于height[j]的矩形,并记录差值(可以装水)。
等于的情况放到任何一种里面都可以,因为等于的时候装水量为0,最终到I,j相遇时循环停止。整个数组只扫描了一遍。
源码:(language:java)

public class Solution {
    public int trap(int[] height) {
        int res=0;
        int l=0;
        int r=height.length-1;
        while(l<r){
            int temp=Math.min(height[l],height[r]);
            if(temp==height[l]){
                l++;
                while(l<r&&height[l]<=temp){
                    res+=temp-height[l];
                    l++;
                }

            }
            else{
                 r--;
                 while(l<r&&height[r]<=temp){
                    res+=temp-height[r];
                    r--;
                }

            }
        }
        return res;
    }
}

成绩:
1ms,beats 87.85%,众数2ms,71.18%
Cmershen的碎碎念:
也没什么要注意的,认真理解了上一题之后本题变化也不是很大。关键是注意“寻找杯子”的过程。

内容概要:本文介绍了一种基于蒙特卡洛模拟和拉格朗日优化方法的电动汽车充电站有序充电调度策略,重点针对分时电价机制下的分散式优化问题。通过Matlab代码实现,构建了考虑用户充电需求、电网负荷平衡及电价波动的数学模【电动汽车充电站有序充电调度的分散式优化】基于蒙特卡诺和拉格朗日的电动汽车优化调度(分时电价调度)(Matlab代码实现)型,采用拉格朗日乘子法处理约束条件,结合蒙特卡洛方法模拟大量电动汽车的随机充电行为,实现对充电功率和时间的优化分配,旨在降低用户充电成本、平抑电网峰谷差并提升充电站运营效率。该方法体现了智能优化算法在电力系统调度中的实际应用价值。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的研究生、科研人员及从事新能源汽车、智能电网相关领域的工程技术人员。; 使用场景及目标:①研究电动汽车有序充电调度策略的设计与仿真;②学习蒙特卡洛模拟与拉格朗日优化在能源系统中的联合应用;③掌握基于分时电价的需求响应优化建模方法;④为微电网、充电站运营管理提供技术支持和决策参考。; 阅读建议:建议读者结合Matlab代码深入理解算法实现细节,重点关注目标函数构建、约束条件处理及优化求解过程,可尝试调整参数设置以观察不同场景下的调度效果,进一步拓展至多目标优化或多类型负荷协调调度的研究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值