刷题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))<<"\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的更多相关文章
- 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 用双指针向中间滑动,较小的高度就作为当前情 ...
- LeetCode - 42. Trapping Rain Water
42. Trapping Rain Water Problem's Link ------------------------------------------------------------- ...
- [Leetcode][Python]42: Trapping Rain Water
# -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 42: Trapping Rain Waterhttps://oj.leetc ...
- leetcode#42 Trapping rain water的五种解法详解
leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain WaterGiven n ...
- [array] leetcode - 42. Trapping Rain Water - Hard
leetcode - 42. Trapping Rain Water - Hard descrition Given n non-negative integers representing an e ...
- LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))
LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存 ...
- [LeetCode] 42. Trapping Rain Water 收集雨水
Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...
- leetCode 42.Trapping Rain Water(凹槽的雨水) 解题思路和方法
Trapping Rain Water Given n non-negative integers representing an elevation map where the width of e ...
- 【LeetCode】42. Trapping Rain Water
Trapping Rain Water Given n non-negative integers representing an elevation map where the width of e ...
随机推荐
- 九十二、SAP中ALV事件之六,复制一个标准工具栏到自己的程序
一.我们来到SE41,点击复制状态按钮 二.点击复制状态后,弹出一个框框,上面是模板内容,下面是我们自己的程序 三.我们根据上一篇的标准模板内容,填好相应的模板和我们的程序的内容 三.点击复制按钮 五 ...
- 114-PHP判断类变量是否相同
<?php class ren{ //定义人类 } class mao{ //定义人类 } $ren=new ren(); //实例化人类的对象 $ren_a=new ren(); //实例化人 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 多态
多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态. C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数. 下面的实例中,基类 Sh ...
- Codeforces Round #616 (Div. 2)
地址:http://codeforces.com/contest/1291 A题就不写解析了,就是给一个数,是不是本身满足这个条件或者删除某些数字来达到这个条件:奇数,各个位上的数字加起来是偶数. # ...
- ls 查看文件
1.按文件大小查看文件 a.降序:ls -lsh moudaen@morton:~$ ls -lshtotal 20M 20M -rw-r--r-- 1 moudaen 65536 20M Nov ...
- 【剑指Offer】面试题09. 用两个栈实现队列
题目 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,delete ...
- VUE随手记坑
1.el-select 默认选中的问题 <el-select v-model="temp.audit" placeholder="请选择"> < ...
- C语言预处理理论2
C语言预处理理论1.头文件包含(1)#include <>和#include ""区别:<>专门用来包含系统提供的头文件(就是系统自带的,不是程序员自己写的 ...
- 10 ~ express ~ 使用 cookie 保存用户 信息
思维导图: (1) 保存 cookie (2)销毁 cookie 一,保存 cookie 1,app.js . 新增代码 var Cookies = require('cookies') /** * ...
- Win10电脑安装虚拟机
版权声明:本文为CSDN博主「MHades」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_42545 ...