首页 > 其他分享 >2023.7.23 接雨水

2023.7.23 接雨水

时间:2023-07-23 11:44:33浏览次数:39  
标签:柱子 23 max top 雨水 height 2023.7 res stk

image

一个能接雨水的区域,肯定是两边高,中间低,基于这个前提出发就能得到两种做法。

动态规划

预处理出每个柱子左边最高的柱子,同时也处理出每个柱子右边的最高的柱子。两者取一个min,记做h。那么如果h比当前柱子更高,那么起码当前这个柱子就可以在垂直领域上可以存下h - 当前柱子高个单位的水。
对每个柱子都进行这样的计算,累计贡献即为答案。

use std::cmp::{max, min};
impl Solution {
    pub fn trap(height: Vec<i32>) -> i32 {
        let n = height.len();

        let mut left_max = vec![0; n];
        let mut right_max = vec![0; n];

        left_max[0] = height[0];
        for i in 1..n {
            left_max[i] = max(left_max[i - 1], height[i]);
        }
        right_max[n - 1] = height[n - 1];
        for i in (0..n-1).rev() {
            right_max[i] = max(right_max[i + 1], height[i]);
        }

        let mut res = 0;
        for i in 0..n {
            res += min(left_max[i], right_max[i]) - height[i];
        }
        res
    }
}

单调栈

每一个两边高中间低的区域,都可以接一定量的雨水,那么我们可以构建一个高度单调递减的单调栈。
假设当前遍历到柱子i,它的高度比栈顶柱子的高度更高,那么不满足单调递减,退栈,再退栈的过程中,由于单调栈内部单调递减,假设栈顶为top,那么有\(h_{top-1} > h_{top}\),且\(h_i > h_{top}\),所以就形成了一个两边高中间低的区域,此时就可以计算出贡献,贡献即为宽度\*(两边高度-栈顶柱子的高度)

涉及到下标计算的话,Rust会有一堆类型转换很难看,用C++实现。

class Solution {
public:
    int trap(vector<int>& height) 
    {
        int n = height.size();
        int stk[n + 1], top = 0;
        int res = 0;
        for (int i = 0; i < n; ++i)
        {
            while (top && height[i] > height[stk[top]])
            {
                --top;
                if (top)
                    res += (i - stk[top] - 1) * (min(height[i], height[stk[top]]) - height[stk[top + 1]]);
            }
            stk[++top] = i;
        }
        return res;
    }
};

标签:柱子,23,max,top,雨水,height,2023.7,res,stk
From: https://www.cnblogs.com/st0rmKR/p/17574820.html

相关文章

  • 我的2023暑假青岛3天2晚旅游计划
    我的原暑假出游计划:https://ntopic.cn/p/2023072301/看海玩水优选青岛小朋友们最开心的暑假来了,今年我的2位小朋友最希望去玩的是看海和玩水。这样今年暑假我的出游目标就比较明确了,该计划实施路径了。出游目的地的比较和选择(维度:温度适宜、有海有沙滩):上海本地游:有海有沙滩的......
  • 2023.29 人工智能的发展特征
    今年以来,人工智能又热了起来,发展有以下几个特征:涌现出很多大模型,它们使用大量数据集进行训练,所以称它们为大型语言模型(LLM)。这些模型是生成式的。这意味着他们可以创建新内容,无论是文本、图像、声音、视频、3D对象,甚至是计算机代码。这是相较于旧人工智能模型的一个进步,旧的......
  • 2023牛客暑期多校训练营2 补题
    D.TheGameofEating题意:有n个人和m道菜,每个人对每个菜的都有一个喜好度a[i][j],所有人都知道其他人的喜好度,现在需要上k道菜,从1,2...,n,1,2.....的顺序来选,如果每个人都只考虑自己的喜好,问最后哪些菜会被端上来Solution我们考虑到所有人都知道其他人的喜好度,也就是说,假设当前要选......
  • 「赛后总结」20230722 CSP 模拟赛
    「赛后总结」20230722CSP模拟赛点击查看目录目录「赛后总结」20230722CSP模拟赛反思题解T1回文思路代码T2快速排序思路代码T3混乱邪恶思路代码T4校门外歪脖树上的鸽子思路吓死我了我还以为K8He不更博了。为啥前天模拟赛不写啊?打过,没参加。为啥昨天模拟赛不......
  • NOI2023游记
    7.21坐飞机提前来成都,飞机晚点了一个小时,但只晚到了15分钟。酒店房间太小了,愤怒。晚上点外卖,吃了一大堆水果。水了一晚上qq。7.22早上起来pvz。报到,因为到太早会有人拿着摄像机拍一路所以9点多到的,结果是AH第一个到的被采访了,不会说话/ll。去宿舍的时候有小姐姐帮忙拎箱子......
  • 2023年7月23日 天气:晴
       今天早上起来看了一个小时的英语阅读,接着背了一小时的英语单词,然后写了一个小时的Java,然后看了一小时的阅读,接着看了两个小时的作业。  明天打算背会单词,然后看几个小时的构建之法,接着出去玩一个小时。......
  • 2023.7.22
    今天去学ret2dlreolve剩下的部分,再次人傻了,剩下内容是64位下NORELRO和PartialRELRO的例题exp,我原本以为和32位差不多,当时也不清楚为什么还要再分个64位出来,差点没去看。结果看了之后人傻了,exp用了之前学过的csu的相关知识,我也不太懂为什么要用这个技巧。然后各种exp部分搞得特......
  • 2023.7.22
    今天依旧五点半起来啦!天气很凉快,但是今天天气不好,出门跑了一会就开始下起了雨运动搭子的家下了暴雨所以她今天在家里蹬车但是其实还是早上起不来哈哈哈我一边跑一边跟她唠嗑知道我回家了以后她才起床明天犹豫了,明天好像也要下雨,不能再雨中漫步了看看情况再说......
  • 2023/7/22 (递推数列的极限)
    ......
  • NOI 2023 游记
    2023.7.22看漫画看到了凌晨三点才睡着,《有害指定同级生》,很好看。订了七点半的闹钟,八点钟起床。不慌,刷个贴吧先。早餐是肠粉。跟教练和lyx来到了机场,等飞机的时候面基了文中和海中的队员,感觉被全方位吊打了。久违地吃了顿乘务餐,这在当年可是我的最爱,可惜太久没吃早就已经忘......