首页 > 其他分享 >LeetCode 面试经典150题---006

LeetCode 面试经典150题---006

时间:2024-04-14 19:00:12浏览次数:30  
标签:150 nums int top 雨水 st --- 006 ans

玩了一天多,两天没写了,下次绝对不摆了(最多摆一天)
#### 42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
n == height.length
1 <= n <= 2 * 104
0 <= height[i] <= 105
不用头想都知道这个题肯定只能用线性复杂度做,至于怎么做呢,我也看了好久。目前来说有两种方法(1)三次线性扫描(2)单调栈。
(1)三次线性扫描。这个方法就是按照列来计算雨水,把所有雨水按照每一列分开,也就是所有块的宽度都是1,如图所示
image
蓝色部分就是接的雨水,黄色框是按照列分的,我为了直观,特地把黄框拉长了,每块的高度不是黄框的高度,需要另行计算,怎么计算呢,请看下面。
我们发现,每一列雨水的高度其实是当前列左边最高的和右边最高的取min,然后再减去这一列本身的高度,不信自己可以模拟一下。其实就是木桶原理,木桶的容量永远都是按照短板的高度来计算的,接雨水也是。有了这个思路,我们就可以先从左到右循环一遍,记录每个位置左边最高的位置,再从右到左循环一遍,记录每个位置右边最高的位置,最终再从左到右循环,计算每列的高度,就是左边最高和右边最高取min之后减去当前位置高度。

class Solution {
public:
    int trap(vector<int>& nums) {
        int n = nums.size();
        vector<int> L(n, 0), R(n, 0);
        for(int i = 1;i < n;i ++ ) L[i] = max(L[i - 1], nums[i - 1]);
        for(int i = n - 2;i >= 0;i -- ) R[i] = max(R[i + 1], nums[i + 1]);
        int ans = 0;
        for(int i = 0;i < n;i ++ ) ans += max(0, min(L[i], R[i]) - nums[i]);
        return ans;
    }
};

(2)单调栈,这个思路太难了,它是将雨水按照行分开,如图所示
image
每块的面积就是长乘宽。单调栈st维护的是一个单调下降的数组,所以才叫单调栈。单调栈维护的是单调下降的位置,如果此时nums[i]<st.top(),说明此时墙的高度还在下降,直接把当前位置入栈。至于为什么维护的是位置,因为计算宽度的时候需要用到下标。如果此时nums[i]>=st.top(),说明此时高度比栈顶要高,如果把栈顶弹出之后还有元素,说明此时的位置i可以存储雨水,因为右边比栈顶高,弹出栈顶后还有元素说明栈顶左边也比栈顶高。需要先弹出栈顶,并用top记录,计算面积(i-st.top()-1)*(min(nums[i],nums[st.top()])-nums[top])

class Solution {
public:
    int trap(vector<int>& nums) {
        int n = nums.size();
        stack<int> st;
        int ans = 0;
        for(int i = 0;i < n;i ++ ){
            while(!st.empty() && nums[i] >= nums[st.top()]){
                int top = st.top();
                st.pop();
                if(st.empty()) break;
                ans += (i - st.top() - 1) * (min(nums[i], nums[st.top()]) - nums[top]);
            }
            st.push(i);
        }
        return ans;
    }
};

总结,困难题,有一次证明了自己是个fw。

标签:150,nums,int,top,雨水,st,---,006,ans
From: https://www.cnblogs.com/timeac-coder/p/18134524

相关文章

  • Causal Inference理论学习篇-Tree Based-Causal Tree
    Tree-BasedAlgorithmsTree-based这类方法,和之前meta-learning类的方法最明显的区别是:这类方法把causaleffect的计算显示的加入了到了树模型节点分裂的标准中从response时代过渡到了effect时代。大量的这类算法基本围绕着树节点分裂方式做文章,普遍采用的是兼容性比较高......
  • [NeuralPS2023]How Re-sampling Helps for Long-Tail Learning
    这篇文章作者写得非常详细,读起来非常舒适。Contribution:在long-taileddata中,re-sampling不一定有效。re-sampling的失败可能是对于不相关的context过拟合导致的,作者设计了实验论证了这一假说。在single-stage的框架下,作者提出了上下文转换增强(contextualtransformationau......
  • 2024年4月14日-UE5-开场动画、火球冲力、打包游戏
    加一个开场动画打开开始地图新建一个关卡序列  打开后,新建相机 然后把过场动画的蓝图拖到屏幕里,选自动播放 -----------------------------------------------------------------------------------------------------------------现在给主角普通攻击火球加一个击......
  • 13-axios 传递参数的方式(data 与 params 的区别)
    Axios官方网址:起步|Axios中文文档|Axios中文网(axios-http.cn)参考文章:axios传递参数的方式(data与params的区别)-知乎(zhihu.com) Axiosa大家都非常的清楚,一个既可以用于客户端或者 服务端发送http请求的库。但是在前后端联调的时候有的时候会很难受,所以这里我......
  • 密码引擎-3-加密API研究
    任务详情密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客......
  • 关于规则制度的思考 - Inspired by soccer match
    Beforeyouread现在您看到的这篇文章,以防您不知道,是我的个人博客,一个大网站的独立分枝,从其他地方无法点进来。不同于微博、知乎,该站不是拥有多个客户端推广的社交媒体。如果我没有给您分享链接,您是几乎不可能找到这个网页的。全文仅记录个人想法,没有任何哗众取宠、散播污名。......
  • 结对编程--四则运算(Python)
    合作伙伴:2252720`importrandomdefgenerate_expression():operators=['+','-','×','÷']#可用的运算符operator=random.choice(operators)#随机选择一个运算符ifoperator=='+':num1=random.randint(0,100)#生成第一......
  • 实验一原型设计--背单词APP
    实验一原型设计--背单词APP对比分析墨刀、Axure、Mockplus等原型设计工具的各自的适用领域及优缺点。答:1.适用领域墨刀:适合移动端原型设计,尤其是APP原型设计。Axure:适合Web端原型设计,也可以用于APP原型设计。Mockplus:适合Web端和移动端原型设计,尤其是快速原型设计......
  • ETL工具-nifi干货系列 第十一讲 处理器UpdateAttribute使用教程
    1、在这里我们重温下nifi里面一个重要的概念FlowFile,如下图所示:FlowFile:FlowFile代表NiFi中的单个数据。nifi数据流中流动的就是flowfile,每个nifi处理器处理的数据也是基于flowfile的。FlowFile由两个组件组成:FlowFile属性(attribute)和FlowFile内容(content)。内容是FlowFile......
  • Redefine library-自定义函数库
    1.jjVolcano_Redefinelibrary(scRNAtoolVis)#jjVolcano只有9个颜色,Redefine到我的24个颜色,并与我umap中的分群颜色对应jjVolcano_Redefine<-function(diffData=NULL,myMarkers=NULL,order.by=c("avg_log2FC"),log2FC.cutoff=0.......