75. Trapping Rain Water
来源:互联网 发布:seo建站 编辑:程序博客网 时间:2024/06/04 19:41
- Trapping Rain Water My Submissions QuestionEditorial Solution
Total Accepted: 66869 Total Submissions: 206382 Difficulty: Hard
Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to trap after raining.
For example,
Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.
The above elevation map is represented by array [0,1,0,2,1,0,1,3,2,1,2,1]. In this case, 6 units of rain water (blue section) are being trapped. Thanks Marcos for contributing this image!
题意:给定一个序列,为柱子的高度,计算中间
可蓄水量
这是一个难题,这里来说说基本思路:
从上图可以看出,每段可以蓄水的区间两端的高度都是这个局部区间的最高和
次高值(或者等高),关键是找到一中可行的方式来划分相同子问题。
1.对于总区间,找到最高值和次高值包含的区间,计算中间蓄水量
2.对于除中间之外的两端区间,转化为相同子问题求解。
对于1中找最高值和次高值有很多方法,这里通过左右夹逼的方式来求,
左右比较冒泡出最优值,同时在比较过程存储了次优值
class Solution {public: int trap(vector<int>& height) { int n= height.size(); if(n<3)return 0; //递归出口 else if(n==3){ if(height[1]<height[0]&&height[1]<height[2]) //三个柱子可计算容水量 return min(height[2]-height[1],height[0]-height[1]); else return 0; } else{ int left=0,right=n-1; int max1=-1,max2=-1,id1,id2; while(left<right){ //依次从两端向中间靠拢,寻找两端的最高处 if(height[left]>=max1){ //保留左半部局部最高点 max1 = height[left]; id1 = left; } if(height[right]>=max2){ //保留右半部局部最高点 max2 = height[right]; id2 = right; } if(height[left]<height[right])++left; //哪边小哪边向中间靠拢 else --right; } int sum=0; for(int i=id1+1;i<id2;++i) //计算中间包含高度和 sum+=height[i]; sum = (id2-id1-1)*min(height[id1],height[id2])-sum;//得到中间容水量 vector<int> fir,sec; auto it_beg = height.begin(),it_end=height.end(); fir.assign(it_beg,it_beg+id1+1); sec.assign(it_beg+id2,it_end); return trap(fir)+sum+trap(sec); //左半部容水+中间容水+右半部容水 } }};
0 0
- 75. Trapping Rain Water
- LeetCode: Trapping Rain Water
- LeetCode : Trapping Rain Water
- Trapping Rain Water
- [LeetCode] Trapping Rain Water
- [Leetcode] Trapping Rain Water
- [Leetcode] Trapping Rain Water
- Trapping Rain Water
- Trapping Rain Water
- [LeetCode]Trapping Rain Water
- Trapping Rain Water
- Trapping Rain Water
- LeetCode-Trapping Rain Water
- Trapping Rain Water
- [leetcode] Trapping Rain Water
- Trapping Rain Water
- [LeetCode] Trapping rain water
- Leetcode: Trapping Rain Water
- ElasticSearch(七)-结构化查询
- [Android设计模式]Android退出应用程序终极方法
- Leetcode 169. Majority Element
- 杂七杂八
- linux 程序动态调用.so文件中的函数
- 75. Trapping Rain Water
- Android一键换肤功能:一种简单的实现
- HDU3926 Hand in Hand(并查集)
- CentOS-6.3安装配置Tomcat-7
- 职场面试:如何快速提升你的通过率?
- hdu 1556 树状数组(区间更新,单点求和)
- Java 集合类
- HDU5543
- hibernate 用原生sql多表查询 ,字段名重复会被覆盖