Leetcode: 43. 接雨水
题目描述:
给定 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
思路分析:
思路一:这是一个类似木桶效应的问题。比较多的思路是利用单调栈来实现。之前大四上算法课的时候也做过类似的题目。维护一个单调递减的栈,当遇到大于当前栈顶的高度时,出栈,计算可接多少水,算法是取现在的栈顶元素与待进栈元素的较小高度减去这个出栈元素的高度,再乘上待进栈元素与栈顶元素的宽度。这里注意维护在栈内的元素时对应的下标,以保证能够求得正确的宽度。这个方法是逐层求可接雨水。时间复杂度为O(n^2)。
思路二:
在实际的面试过程中,肯定是希望能够优化这个算法,考虑用双指针,逐列的来取雨水。维护左右两个指针left和right,分别指向数组的头尾,同时维护两个数值,存maxleft和maxright,即当前遍历过的所有左右元素的最大高度。需要进行判断,若left的高度小于right的高度,则left++,否则right--。同时在每次判断是还需要多一次判断,即是否能够加水,需要判断当left小于right时,left是否小于maxleft,若是,那么就可以加水,所加的水为maxleft-height[left]。反之,当right小于等于left的高度时,添加maxright-height[right]的水量。这个方法的时间复杂度为O(n)。
代码:
思路一:
class Solution {
public:
int trap(vector<int>& height) {
if(height.size()==)
return ;
int sum_rain = ;
stack<int> s;
for(int i=; i<height.size(); i++)
{
if(s.empty() || height[i]<height[s.top()])
s.push(i);
else
{
while(!s.empty() && height[i]>height[s.top()])
{
int pre = s.top();
s.pop();
if(!s.empty())
{
sum_rain += (min(height[i], height[s.top()])-height[pre])*(i-s.top()-);
}
}
s.push(i);
}
}
return sum_rain;
}
};
思路二:
class Solution {
public:
int trap(vector<int>& height) {
if(height.size()==)
return ;
int sum_rain = ;
int left=, right = height.size()-;
int leftmax=, rightmax=;
while(left<right)
{
if(height[left]<height[right])
{
if(height[left]<leftmax)
{
sum_rain += (leftmax-height[left]);
}
else
leftmax = height[left];
left++;
}
else
{
if(height[right]<rightmax)
{
sum_rain += (rightmax-height[right]);
}
else
rightmax = height[right];
right--;
}
}
return sum_rain;
}
};
Leetcode: 43. 接雨水的更多相关文章
- LeetCode:接雨水【42】
LeetCode:接雨水[42] 题目描述 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1, ...
- [LeetCode] 43. Multiply Strings 字符串相乘
Given two non-negative integers num1 and num2represented as strings, return the product of num1 and ...
- LeetCode 43. 字符串相乘(Multiply Strings)
43. 字符串相乘 43. Multiply Strings 题目描述 给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式. ...
- [LeetCode]42. 接雨水(双指针,DP)
题目 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下, ...
- [LeetCode] 43. Multiply Strings ☆☆☆(字符串相乘)
转载:43. Multiply Strings 题目描述 就是两个数相乘,输出结果,只不过数字很大很大,都是用 String 存储的.也就是传说中的大数相乘. 解法一 我们就模仿我们在纸上做乘法的过程 ...
- LeetCode 43 Multiply Strings(字符串相乘)
题目链接: https://leetcode.com/problems/multiply-strings/?tab=Description 求解大数相乘问题 按照上图所示,进行嵌套循环计算 ...
- leetcode 42. 接雨水 JAVA
题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...
- Leetcode 407.接雨水
接雨水 给定一个 m x n 的矩阵,其中的值均为正整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 说明: m 和 n 都是小于110的整数.每一个单位的高度都大于0 且小 ...
- Leetcode 42.接雨水
接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水. 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下 ...
随机推荐
- C++ GDI图形设备接口
一.概念 1. GDI:(Graphics Device Interfase)图形设备接口,是一个应用程序与输出设备之间的中介. 一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以 ...
- android的子线程切换到主线程
在子线程中,如果想更新UI,必须切换到主线程,方法如下: if (Looper.myLooper() != Looper.getMainLooper()) { // If we finish mark ...
- 服务上的图片直接在浏览器上可以打开,但是在img上报404错误处理方法
在index.html中添加代码如下 <meta name="referrer" content="no-referrer" /> 如果还是存在问题 ...
- JavaScript 运算符(Operator)
一.算数运算符 1.加法(+) 表示操作数相加: 处理特殊值规则: 如果两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来: 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后 ...
- 什么是MVC框架?
1.什么是mvc Model View Controller,是模型-视图-控制器的缩写,一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里,在改进和个性化 ...
- MES被重新定义?做到这几点才算智能制造
在工业4.0背景下,推动智能制造,构建智能工厂.智能生产.智能物流和智能服务体系,我们需要对MES系统重新进行定义,主要从以下几个方面进行说明: MES深度融入企业运营环节 智能工厂中的机器将全部由软 ...
- kbmmw 5.10.10 发布
这个版本主要是bug修正. New stuff ========= - Added OnException event property to TkbmMWSchedu ...
- Oracle ERP 库存管理(业务流程 核心流程)
库存核心业务 库存管理的核心是对货物本身的管理,是对货物的数量与相关属性的管理,目的是为销售与采购服务,确保合理的库存保有量,处理库存分类帐目与进出流水帐,以单据的形式基本涵盖仓库的各种进出库业务. ...
- 4484: [Jsoi2015]最小表示(拓扑序+bitset维护连通性)
4484: [Jsoi2015]最小表示 题目链接 题解: bitset的题感觉都好巧妙啊QAQ. 因为题目中给出的是一个DAG,如果\(u->v\)这条边可以删去,等价于还存在一个更长的路径可 ...
- SpringBoot Ajax跨域问题(session共享问题)
ajax 发送post请求至springBoot出现跨域问题 需要在springBoot加上注解 @CrossOrigin 就能解决 报错信息 前端js代码 如果用上面的方式,session不能共享 ...