水池蓄水问题(Trapping Rain Water)
给定一个数组,表示连续的地表的高度,求当下雨时,这个连续的地表最多能蓄多少水,比如给定数组[0,1,0,2,1,0,1,3,2,1,2,1]得到结果为6,如下图所示:
![](/assets/blank.gif)
int totalWater(vector<int>& vec){
if(vec.size() < 3)
return 0;
vector<int> leftMax(vec.size()),rightMax(vec.size());
leftMax[0] = vec[0];
rightMax[vec.size()-1] = vec[vec.size()-1];
for(int i = 1;i<vec.size()-1;i++){
leftMax[i] = max(leftMax[i-1],vec[i]);
rightMax[vec.size()-1-i] = max(rightMax[vec.size()-i],vec[vec.size()-1-i]);
}
leftMax[vec.size()-1] = max(leftMax[vec.size()-2],vec[vec.size()-1]);
rightMax[0] = max(rightMax[1],vec[0]);
int sum = 0;
for(int i = 0;i<vec.size();i++)
sum += (min(leftMax[i],rightMax[i]) - vec[i]);
return sum;
}
说明:代码中将第一次和第二次扫描合并为一次扫描,但是本质上的计算次数没有减少,思路还是跟方法一说明的一样
int totalWater2(vector<int>& vec){
if(vec.size() < 3)
return 0;
int leftMax = vec[0],rightMax = vec[vec.size()-1];
int left = 0,right = vec.size()-1;
int sum = 0;
while(left < right){
if(vec[left] > vec[right]){
right--;
if(vec[right]<rightMax){
sum += (min(leftMax,rightMax)-vec[right]);
}else{
rightMax = vec[right];
}
}else{
left++;
if(vec[left]<leftMax){
sum += (min(leftMax,rightMax)-vec[left]);
}else{
leftMax = vec[left];
}
}
}
return sum;
}
说明:方法二减少了遍历数组的次数,只有一次遍历就能完成,应该是最优方法。
水池蓄水问题(Trapping Rain Water)相关推荐
- leetcode#42 Trapping rain water的五种解法详解
leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain Water Given ...
- LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))
LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存 ...
- Leetcode 动态规划 Trapping Rain Water
本文为senlie原创.转载请保留此地址:http://blog.csdn.net/zhengsenlie Trapping Rain Water Total Accepted: 14568 Tota ...
- 【重点:BFS】LeetCode 407. Trapping Rain Water II
LeetCode 407. Trapping Rain Water II 博客转载自:http://www.cnblogs.com/grandyang/p/5928987.html [太难了,被智商碾 ...
- 【重点:DP 双指针 栈】LeetCode 42. Trapping Rain Water
LeetCode 42. Trapping Rain Water 本博客转载自:http://www.cnblogs.com/grandyang/p/4402392.html [自己又不会做,抄的-& ...
- LeetCode 42 Trapping Rain Water 收集雨水
LeetCode 42 Trapping Rain Water 收集雨水 Given n non-negative integers representing an elevation map whe ...
- Leetcode 407. Trapping Rain Water II 收集雨水2 解题报告
1 解题思想 我看了下题目,发现比预想中的简单,加之我比较烂,所以其实我还是没做,只是看懂了上回贴的代码,然后做了一下注释,现在我来讲下题目. 首先请看下上一题,上一题是2D的这题是3D的: Leet ...
- LeetCode42. Trapping Rain Water
LeetCode42. Trapping Rain Water 原题地址 题目描述 Given n non-negative integers representing an elevation ma ...
- [leetcode]Trapping Rain Water @ Python
原题地址:https://oj.leetcode.com/problems/trapping-rain-water/ 题意: Given n non-negative integers represe ...
- 【leetcode】42. Trapping Rain Water 计算坑洼地的积水量
1. 题目 Given n non-negative integers representing an elevation map where the width of each bar is 1, ...
最新文章
- esp32 python-ESP32教程:MicroPython支持
- Spring8:一些常用的Spring Bean扩展接口
- 登录页面html代码_【网络自动化平台开发】—— 登录组件
- halcon 单通道图像转成3通道_halcon图像处理基本运算
- 基于PHPEnv的本地环境搭建—PHP第一个项目:HelloWorld(从安装到运行)
- leetcode 34. 在排序数组中查找元素的第一个和最后一个位置(二分查找)
- java的栈图形演示
- 牵手大众、现代,滴滴绯闻“女友”Aurora无人车启动商业化
- MPEG2简单码流分析
- RPM、SRPM和YUM,linux包rpm包管理工具
- C语言程序设计(第三版)何钦铭著 习题2-2
- 学习Linux命令(11) startx
- chipseq MACS2 call peaks 报错解决方法——创建虚拟环境
- QQ图片文件夹说明及清理
- ffmpeg 视频去水印
- 软件需求分析(以美团外卖为例)
- TMC5160/5130驱动芯片使用简明指南
- IOS ANDROID WINDOWS PHONE国内格局的悄然变化-应用电台www.apphub.fm
- Java单个文件下载
- Vue | 18.本地应用 - 小黑记事本
热门文章
- ai智能医疗产业_人工智能以减少医疗错误
- 知识付费的七种变现方式
- Java一瓶可乐_Java实现可乐瓶问题
- 服务器请求微信后台(api.weixin.qq.com)过慢处理
- signature=4209f9d53642a2c1cdf0e4a92ba622eb,HIERBA GUINEA (Panicum maximum Jacq.)
- 来自Google持续更新中的TCP BBR v2.0最新进展
- Beta冲刺-第四天
- Chef学习之三:Chef基础知识 (转贴)
- Python爬取系列妹子图实战总结(程序员节福利哟)
- 百度地圖定位setScanSpan無效的問題