一、题目说明

题目是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. solidworks快捷键画图

    平移 :ctrl+鼠标中键 旋转:鼠标中键 缩放:移动中键

  2. 将数据写入已有的excel文件

    /** * 将反馈结果写入excel中 * */ public static void writeExcelResult(String url,List<Integer> result) ...

  3. maven项目打包部署到虚拟机测试和生产环境上及查看日志操作

    调试通过后提交代码到gitlab,打包部署到相应环境(测试或生产环境)步骤一样1.打包在要打包的项目上右键run as maven clean 清除原来的包,然后run as maven instal ...

  4. 119-PHP调用private成员的方法

    <?php class ren{ //定义人类 private $birthday='1990-12-20'; //定义private修饰的成员属性 public function say_bi ...

  5. 吴裕雄--天生自然C++语言学习笔记:C++ 数组

    C++ 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 number0. ...

  6. POJ 1050:To the Max

    To the Max Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 43241   Accepted: 22934 Desc ...

  7. 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ

    鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本 ...

  8. bzoj 3876: [Ahoi2014]支线剧情

    就是加一个1的下界就好了. #include<bits/stdc++.h> #define N 100005 #define LL long long #define inf 0x3f3f ...

  9. 自学Java第五章——《面向对象的基本特征》

    面向对象的基本特征: 1.封装 2.继承 3.多态 6.1 封装 1.好处: (1)隐藏实现细节,方便使用者使用 (2)安全,可以控制可见范围 2.如何实现封装? 通过权限修饰符 面试题:请按照可见范 ...

  10. UITextFeild的基本属性

    textField 基本属性   _textField.frame = CGRectMake(0, 0, 200, 50); _textField.delegate = self; _textFiel ...