一、题目说明

题目是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))<<"\n"; r = {5,4,1,2};
cout<<s.trap(r)<<":"<<(1==s.trap(r))<<"\n"; r = {5,2,1,2,1,5};
cout<<s.trap(r)<<":"<<(14==s.trap(r))<<"\n"; r = {5,5,1,7,1,1,5,2,7,6};
cout<<s.trap(r)<<":"<<(23==s.trap(r))<<"\n"; 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))<<"\n";
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;
}
};

性能虽然差点,但可读性好多了。

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.

刷题42. Trapping Rain Water的更多相关文章

  1. leetcode 11. Container With Most Water 、42. Trapping Rain Water 、238. Product of Array Except Self 、407. Trapping Rain Water II

    11. Container With Most Water https://www.cnblogs.com/grandyang/p/4455109.html 用双指针向中间滑动,较小的高度就作为当前情 ...

  2. LeetCode - 42. Trapping Rain Water

    42. Trapping Rain Water Problem's Link ------------------------------------------------------------- ...

  3. [Leetcode][Python]42: Trapping Rain Water

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 42: Trapping Rain Waterhttps://oj.leetc ...

  4. leetcode#42 Trapping rain water的五种解法详解

    leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain WaterGiven n ...

  5. [array] leetcode - 42. Trapping Rain Water - Hard

    leetcode - 42. Trapping Rain Water - Hard descrition Given n non-negative integers representing an e ...

  6. LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))

    LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存 ...

  7. [LeetCode] 42. Trapping Rain Water 收集雨水

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  8. leetCode 42.Trapping Rain Water(凹槽的雨水) 解题思路和方法

    Trapping Rain Water Given n non-negative integers representing an elevation map where the width of e ...

  9. 【LeetCode】42. Trapping Rain Water

    Trapping Rain Water Given n non-negative integers representing an elevation map where the width of e ...

随机推荐

  1. 洛谷 P2049 魔术棋子(vector)

    题目传送门 解题思路: 用一个vector维护每一个点都可以乘出哪些数来,然后将(n,m)的所有数从小到大输出即可. 要用一个bool ff[j][k]来维护当前这个点(i,j)里面有没有被放过k,以 ...

  2. Python 自动登录哔哩哔哩(2captcha打码平台)

    前言 研究爬虫的各位小伙伴都知道,需要登录才能获取信息的网站,是比较难爬的,原因就是在于,现在各大网站为了反爬,都加入了图片验证码,滑动验证码之类的干扰 本篇就针对哔哩哔哩的滑动验证码进行讲解和破解 ...

  3. 八十七、SAP中ALV事件之一,事件的声明

    一.我们双击"REUSE_ALV_GRID_DISPLAY",来到SE37界面, 二,来到这儿,点击SLIS_T_EVENT, 三.可以看到SLIS_T_EVENT的定义,有一个n ...

  4. Bulma CSS - 简介

    Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 Bulma是什 ...

  5. PHP二维数组--去除指定列含有重复项的数组

    给定二维数组: $arr = array( '0' => array('张三',2,3,4), '1' => array('李四',2,3,4), '2' => array('张三' ...

  6. css常用技巧1

    css绘制三角形 <style> .triangle-box{ margin: 50px auto; height: 300px; width: 500px; box-shadow: 1p ...

  7. 刷题31. Next Permutation

    一.题目说明 题目是31. Next Permutation,英文太差看不懂,翻译了一下.才知道是求字典顺序下的下一个排列,不允许使用额外空间.题目难度是Medium! 二.我的实现 首先要进一步理解 ...

  8. .NET CORE AutoMapper使用

    1.通过nuget安装AutoMapper,版本是7.0.1, 安装AutoMapper.Extensions.Microsoft.DependencyInjection  版本是4.0.1 不是以上 ...

  9. Python 中 使用 HTMLTestRunner 模块生成测试报告

     使用 HTMLTestRunner 模块可以生成测试报告,但是系统自带的报告不详细,不好看,所以找了一份详细的报告 HTMLTestRunner 模板,直接导入就能使用 两种方法生成HTML报告,都 ...

  10. Codeforces Round #603 (Div. 2) A. Sweet Problem(水.......没做出来)+C题

    Codeforces Round #603 (Div. 2) A. Sweet Problem A. Sweet Problem time limit per test 1 second memory ...