从来好事天生俭,自古瓜儿苦后甜。这篇文章主要讲述刷题42. Trapping Rain Water相关的知识,希望能为你提供帮助。
一、题目说明
题目是42. Trapping Rain Water,翻译起来就是“接雨水”。给n个非负正数代表高度,每个正数宽度为1,让计算能多少雨水。题目难度是Hard
二、我的解法
这个题目是找“坑”,然后计算里面可以存的“雨”。总共提交了5次,前面几次都是边界错误。
代码如下:
#include<
iostream>
#include<
vector>
using namespace std;
class Solution{
public:
int trap(vector<
int>
&
height){
if(height.size()<
1) return 0;
int len = height.size();
int sum = 0,area=0,h;
bool lflag = false,rflag = false;
int left=0,leftStart,right,rightEnd=len-1,mid;
while(left<
rightEnd){
//从左边开始找第1个高度
leftStart = left;
while(leftStart<
len-1 &
&
height[leftStart]<
=height[leftStart+1]){
leftStart++;
}
left = leftStart;
//从右边开始找第1个高度
right = rightEnd;
while(right>
left &
&
height[right]<
=height[right-1]){
right--;
}
rightEnd = right;
if(height[rightEnd]<
=height[left]){
right = rightEnd;
//降
while(right>
left &
&
(height[right]<
=height[rightEnd])){
right--;
}
//升
while(right>
left &
&
(height[right]<
height[right-1])){
right--;
}h = height[right]<
height[rightEnd] ? height[right]: height[rightEnd];
area = 0;
for(int t=right+1;
t<
rightEnd;
t++){
if(h>
height[t]){
area = area + (h-height[t]);
}
}sum += area;
rightEnd = right;
}else{
leftStart = left;
//降
while(left<
rightEnd &
&
(height[left]<
=height[leftStart])){
left++;
}
//升
while(left<
rightEnd &
&
(height[left]<
height[left-1])){
left++;
}h = height[left]<
height[leftStart] ? height[left]: height[leftStart];
area = 0;
for(int t=leftStart+1;
t<
left;
t++){
if(h>
height[t]){
area = area + (h-height[t]);
}
}sum += area;
leftStart = left;
}
}return sum;
}
};
int main(){
Solution s;
vector<
int>
r;
r = {0,1,0,2,1,0,1,3,2,1,2,1};
cout<
<
s.trap(r)<
<
"
:"
<
<
(6==s.trap(r))<
<
"
"
;
r = {5,4,1,2};
cout<
<
s.trap(r)<
<
"
:"
<
<
(1==s.trap(r))<
<
"
"
;
r = {5,2,1,2,1,5};
cout<
<
s.trap(r)<
<
"
:"
<
<
(14==s.trap(r))<
<
"
"
;
r = {5,5,1,7,1,1,5,2,7,6};
cout<
<
s.trap(r)<
<
"
:"
<
<
(23==s.trap(r))<
<
"
"
;
r = {6,4,2,0,3,2,0,3,1,4,5,3,2,7,5,3,0,1,2,1,3,4,6,8,1,3};
cout<
<
s.trap(r)<
<
"
:"
<
<
(83==s.trap(r))<
<
"
"
;
return 0;
}
性能如下:
Runtime: 8 ms, faster than 61.40% of C++ online submissions for Trapping Rain Water.
Memory Usage: 9.1 MB, less than 91.14% of C++ online submissions for Trapping Rain Water.
三、优化措施
代码虽然正确,但看起来很难过!多番寻找,相对优雅的代码如下:
class Solution{
public:
//left、right
int trap(vector<
int>
&
height) {
int n = height.size();
int lhigh = 0, rhigh = n-1;
int diff = 0;
// scan from left to right
for(int i = lhigh;
i<
n;
i++)
{
if (height[i] <
height[lhigh]) continue;
for (int j = lhigh+1;
j<
i;
j++) diff += height[lhigh]-height[j];
lhigh = i;
}// scan from right to left
for (int i = rhigh;
i>
=lhigh;
i--)
{
if (height[i] <
height[rhigh]) continue;
for (int j = i+1;
j<
rhigh;
j++) diff += height[rhigh]-height[j];
rhigh = i;
}return diff;
}
};
【刷题42. Trapping Rain Water】性能虽然差点,但可读性好多了。
Runtime: 12 ms, faster than 17.25% of C++ online submissions for Trapping Rain Water.
Memory Usage: 9 MB, less than 94.94% of C++ online submissions for Trapping Rain Water.
推荐阅读
- Android开发—错误记录1(W/System.err: java.net.ConnectException: Connection refused)
- Azure App Service-多语言/高可用/自动缩放的Web托管服务
- mybatis框架(入门方法,dao层原始开发方法,mapper代理开发)(sqlserver数据库)
- .NET(c#) 移动APP开发平台之Smobiler开发
- Azure App Service-添加自定义域名和SSL保护
- .NET(c#) 移动APP开发平台 - Smobiler平台介绍
- Android学习11
- 解决Cisco KVM报错 “Your security settings have blocked an application with an expired or not-yet-v
- android基本操作