给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]

输出: 6

分析:

解法1:暴力法

对每个元素取其左右两边的最大值的最小值,然后减去当前值

时间复杂度:O(N^2),对每个元素都需要取其左右两边的最大值

空间复杂度:O(1)

class Solution
{
public:
int trap(vector<int>& v)
{
int ans=0;
if(v.size()==0)
return 0;
for(int i=1; i<v.size()-1; i++)
{
int leftmax=0;
for(int j1=i-1; j1>=0; j1--) //取其左边元素的最大值
{
leftmax=max(leftmax,v[j1]);
}
int rightmax=0;
for(int j2=i+1; j2<v.size(); j2++) //取其右边元素的最大值
{
rightmax=max(rightmax,v[j2]);
}
int x=min(leftmax,rightmax)-v[i];//取两个最大值的最小值
if(x>0)//能够储水
{
ans+=x;//符合要求则加上
}
}
return ans;
}
}

解法2:动态规划

暴力法每次都有寻找其左右两边最大元素的最小值

我们可以通过两次O(N)的遍历记录下当前元素的左右两边最大值的最小值

时间复杂度:O(N)

空间复杂度:O(N)

class Solution
{
public:
int trap(vector<int>& v)
{
int ans=0;
if(v.size()==0)
return 0;
int n=v.size();
int dp[n];//dp[i]:当前元素i左右两边最大值的最小值
dp[0]=0;
dp[n-1]=0; for(int i=1; i<n-1; i++) //左边最大值
{
dp[i]=max(dp[i-1],v[i-1]);
}
for(int i=n-2; i>=1; i--) //右边最大值和当前左边最小值比较
{
dp[i]=min(dp[i],max(dp[i+1],v[i+1]));
}
for(int i=1; i<n-1; i++) //符合要求累加即可
{
if(dp[i]-v[i]>0)
ans+=dp[i]-v[i];
}
return ans;
}
}

解法3:左右双指针法



先找到最高点k,k把数组分为了左右两部分

对左半部分的当前值来说:

如果当前值大于当前值左边的最大值,那么水就会向左边流走,当前值就储存不了水,只能更新一下左边最大值

如果当前值不大于当前值左边的最大值,那么就可以储存住水,水的量就是当前左边最大值减去当前值

对右半部分的当前值来说:

如果当前值小于当前值右边的最大值,那么水就会向右边流走,当前值就储存不了水,只能更新一下右边最大值

如果当前值不大于当前值右边的最大值,那么就可以储存住水,水的量就是当前右边最大值减去当前值

注意,左边最大值和右边最大值都不是相对于整个左边部分或右边部分来说的

左边最大值是相当于当前元素的左边的所有元素来说的

右边最大值是相当于当前元素的右边的所有元素来说的

时间复杂度:O(N)

空间复杂度:O(1)

class Solution
{
public:
int trap(vector<int>& v)
{
int ans=0;
int n=v.size();
if(n==0)
return 0;
int k=0;
for(int i=1; i<n; i++) //找到最高点k,k把数组分为左右两部分(都不包含k)
{
if(v[i]>v[k])
k=i;
}
int maxleft=0;//左边最大值指针
for(int i=1; i<k; i++) //左半部分
{
if(v[maxleft]<v[i])//不能储水,水向左边流走了
maxleft=i;//更新左边最大值
else
ans+=(v[maxleft]-v[i]);//可以储存水
}
int maxright=n-1;//右边最大值指针
for(int i=n-2; i>k; i--) //右半部分
{
if(v[maxright]<v[i])//不能储存水。水向右边流走了
maxright=i;//更新右边最大值
else
ans+=(v[maxright]-v[i]);//可以储存水
}
return ans;
}
}

【leet-code】接雨水的更多相关文章

  1. 【Leet Code】Palindrome Number

    Palindrome Number Total Accepted: 19369 Total Submissions: 66673My Submissions Determine whether an ...

  2. Leet Code 771.宝石与石头

    Leet Code编程题 希望能从现在开始,有空就做一些题,自己的编程能力太差了. 771 宝石与石头 简单题 应该用集合来做 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S  ...

  3. #Leet Code# Gray Code

    描述: 要求相邻数2进制差一位 先获得n-1的列表表示小于 2^(n-1) 的符合要求的列表,加上最高位的加成 2^(n-1) 就是大于等于 2^(n-1) 的符合要求的列表,后者翻转一下就能够与前者 ...

  4. #Leet Code# Permutation

    描述: 输出全排列 代码: class Solution: # @param num, a list of integer # @return a list of lists of integers ...

  5. #Leet Code# Unique Path(todo)

    描述: 使用了递归,有些计算是重复的,用了额外的空间,Version 1是m*n Bonus:一共走了m+n步,例如 m = 2, n = 3 [#, @, @, #, @],所以抽象成数学问题,解是 ...

  6. #Leet Code# Populating Next Right Pointers in Each Node II

    描述:注意需要先self.connect(right)再self.connect(left),否则会有case通不过,原因是左边递归执行时依赖与右边的next已经建立,而先执行connect(left ...

  7. #Leet Code# Sqrt

    描述:log(n) 代码: class Solution: # @param x, an integer # @return an integer def getVal(self, begin, en ...

  8. #Leet Code# Best Time to Buy and Sell Stock

    描述:数组 A,对于 i < j, 找到最大的 A[j] - A[i] 代码: class Solution: # @param prices, a list of integer # @ret ...

  9. #Leet Code# Convert Sorted Array to Binary Search Tree

    描述:递归 代码: class Solution: # @param num, a list of integers # @return a tree node def sortedArrayToBS ...

  10. #Leet Code# Evaluate Reverse Polish Notation

    描述:计算逆波兰表达法的结果 Sample: [", "*"] -> ((2 + 1) * 3) -> 9 [", "/", & ...

随机推荐

  1. ta和夏天一起来了

    目录 ta和夏天一起来了 上半年,过去的就让去过去,遗憾的也别再遗憾. 下半年,拥有的请好好珍惜,想要的请努力去追. ta和夏天一起来了 ​ 转眼结束了2019的上半年,在这个月末, 季度末, 周末, ...

  2. MySQL连接超时处理

    1.由于MySQL默认是8小时的wait_timeout,当超过8小时的连接时间后,在JAVA中调用将出现如下报错 SEVERE EXCEPTION com.mysql.jdbc.exceptions ...

  3. c# MVC5(二) MVC与IOC结合

    今天主要来讲解使用Unity来自动注入.Unity前面我们已经详细的介绍过了,如有需要请自行前往去看,今天我们的重点是说MVC与IOC的结合. IOC:控制反转,控制反转的工具是DI(依赖注入:构造函 ...

  4. Linux shell awk中print及变量使用

    Linux处理文本工具     grep: 过滤文本内容     sed:  编辑文本内容     awk:   显示文本      awk:  Aho Peter Weinberger  Kerni ...

  5. Nios II IDE代码优化,quartus ii 11.0版本IDE

    开发Altera Nios II软件可使用Nios II IDE或 Nios II Software BuildTools for Eclipse(即:Nios II SBT for Eclipse) ...

  6. Extended Traffic LightOJ - 1074

    题目链接:https://vjudge.net/problem/LightOJ-1074 思路:(busyness of destination - busyness of source)3 可能会是 ...

  7. Vuex中mapState的用法

    Vuex中mapState的用法   今天使用Vuex的时候遇到一个坑,也可以说是自己的无知吧,折腾了好久,终于发现自己代码的错误了.真是天雷滚滚~~~~~~ index.js import Vue ...

  8. 使用WIFI网卡的AP功能

    前几篇博客中,wifi无线网卡都工作于STA模式,那么它能否工作于AP模式.本篇博客就研究使wifi 无线网卡工作于AP模式.使用一个应用程序hostapd,关于它的介绍可以去此网站https://w ...

  9. python基础之函数重点

    函数的返回值 现在有一个需求,比较两个人的月薪,然后想获取月薪较大人的年薪. 如果需要在程序中拿到函数的处理结果做进一步的处理,则需要函数必须要有返回值. 需要注意的是: return是一个函数结束的 ...

  10. DataOps Reading Notes

    质量.效率.成本.安全,是运维工作核心四要素. AIOps 技术会涉及到数据收集方面的基础监控,服务监控和业务监控,甚至会涉及到与持续交付流水线的数据和状态整合(比如在软件发布的阶段会自动关闭某些监控 ...