做网站泊头net网站开发是什么
做网站泊头,net网站开发是什么,东营运政信息网官网查询,网站营销计划书目录
#x1f4a1;题目描述
#x1f4a1;双指针解法
#x1f4a1;单调栈解法 #x1f4a1;题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图#xff0c;计算按此排列的柱子#xff0c;下雨之后能接多少雨水。 提示#xff1a;
n height.length1 n…
目录
题目描述
双指针解法
单调栈解法 题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图计算按此排列的柱子下雨之后能接多少雨水。 提示
n height.length1 n 2 * 1040 height[i] 105
双指针解法
思路
假设每个宽度为1的柱子那里有一个高度未知的宽度为1的水桶这个水桶能接的水就是当前柱子所处位置能留下的雨水而水桶的左边木板的高度取决于当前柱子左边所有的柱子中最高的那个柱子的高度水桶右边木板的高度取决于当前柱子右边所有的柱子中最高的柱子的高度而水桶左右木板中较小的那个木板的高度减去当前柱子的高度就是当前水桶能接到的水也就是当前位置留下的雨水。 class Solution {
public:int trap(vectorint height) {int nheight.size();vectorintpmax(n,0);vectorintsmax(n,0);pmax[0]height[0];for(int i1;in;i){pmax[i]max(pmax[i-1],height[i]);//计算前缀最大值}smax[n-1]height[n-1];for(int in-2;i0;i--){smax[i]max(height[i],smax[i1]);//计算后缀最大值}int ans0;for(int i0;in;i){ans(min(pmax[i],smax[i])-height[i]);}return ans;}
};
时间复杂度O(n)
空间复杂度O(n)
优化
上一个解法需要用到两个大小为n的数组分别记录前缀最大值和后缀最大值而事实上我们可以在左右指针遍历的同时分别记录左边前缀最大值和右边后缀最大值如果左边前缀最大值小于右边后缀最大值那么可以计算左边所能接的雨水计算方法和上面一样这里就是左边木板高度较小就可以直接减去柱子高度否则计算右边所能接的雨水左右最大高度相等时随便计算哪一边都是可以的。 class Solution {
public:int trap(vectorint height) {/*假设有一个宽为1的水桶放在每一个柱子那里高度未知每个水桶接的水的多少取决于当前柱子高度和它左右区间中分别的最大的柱子高度中较小的那个柱子高度之差例如假设当前柱子高度为1左边最大的柱子高度为3右边最大柱子高度为2当前柱子这里的水桶能接的水量为2-11*/int nheight.size();int pmax0;int smax0;int l0;int rn-1;int ans0;int i0;while(lr){pmaxmax(pmax,height[l]);smaxmax(smax,height[r]);if(pmaxsmax){anspmax-height[l];l;}else{anssmax-height[r];r--;}}return ans;}
};
单调栈解法 思路
这个方法的思路就是求每个凹槽的面积即横向求解上一个方法是纵向求解要得到凹槽的面积就要求出当前柱子左右两边第一个比它高的柱子想到这里就会发现其实很适合用单调栈的方法来求解。
对于这个单调栈到底是用递增栈还是递减栈呢 由于我们是要找到当前柱子左右两边第一个比它高的柱子当我们没有找到比它高的柱子的时候是会把这个柱子的高度入栈的一旦发现添加的柱子高度大于栈顶元素了此时就出现凹槽了栈顶元素就是凹槽底部的柱子栈顶第二个元素就是凹槽左边的柱子而添加的元素就是凹槽右边的柱子。而遇到相同元素时可以更新栈内元素也可以选择不处理。 栈内是存储柱子的高度还是下标呢 这里选择存下标因为我们要求的是面积存下标既可以得到凹槽的宽度也可以得到凹槽的高度而凹槽的高度是这个柱子左右两边第一个比它高的柱子的高度中较小的那一个减去它的高度 对于栈顶元素和当前柱子的高度主要有三种情况 情况一当前遍历的元素柱子高度小于栈顶元素的高度 height[i] height[st.top()]此时选择入栈。情况二当前遍历的元素柱子高度等于栈顶元素的高度 height[i] height[st.top()]此时可以选择更新栈内元素的下标。情况三当前遍历的元素柱子高度大于栈顶元素的高度 height[i] height[st.top()]此时就出现凹槽了计算凹槽面积。 可以发现栈顶和栈顶的下一个元素以及要入栈的元素这三个元素来接雨水
具体代码
class Solution {
public:int trap(vectorint height) {int nheight.size();stackintst;//单调递增栈st.push(0);int sum0;for(int i1;in;i){if(height[i]height[st.top()]){st.push(i);}else if(height[i]height[st.top()]){st.pop();st.push(i);//更新相同高度柱子的下标}else{while(!st.empty()height[i]height[st.top()]){int midst.top();st.pop();if(!st.empty()){int lmin(height[st.top()],height[i])-height[mid];int wi-st.top()-1;suml*w;}}}st.push(i);}return sum;}
};
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/86258.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!