博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
42. Trapping Rain Water
阅读量:2351 次
发布时间:2019-05-10

本文共 3336 字,大约阅读时间需要 11 分钟。

题目

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.

在这里插入图片描述
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.

Example:

Input: [0,1,0,2,1,0,1,3,2,1,2,1]

Output: 6

我的想法

分层?但是这样复杂度太高了

解答

leetcode solution 1: Brute Force

第一步,计算左边的最高高度(包括当前位置)
第二步,计算右边的最高高度(包括当前位置)
第三步,储水量取决于左右两边高度中较低值与当前高度的差值

int trap(vector
& height){
int ans = 0; int size = height.size(); for (int i = 1; i < size - 1; i++) {
int max_left = 0, max_right = 0; for (int j = i; j >= 0; j--) {
//Search the left part for max bar size max_left = max(max_left, height[j]); } for (int j = i; j < size; j++) {
//Search the right part for max bar size max_right = max(max_right, height[j]); } ans += min(max_left, max_right) - height[i]; } return ans;}

leetcode solution 2: Dynamic Programming

在这里插入图片描述
第一步,从左边计算每个位置的最高高度
第二步,从右边计算每个位置的最高高度
第三步,储水量等于前两步重叠部分的高度(即取较小值)减去当前位置的高度

核心思想:用数组将最高位置记录下来,避免了solution1中大量的重复计算

class Solution {
public int trap(int[] height) {
if(height == null || height.length<3) return 0; int ans = 0; int[] max_left = new int[height.length]; int[] max_right = new int[height.length]; max_left[0] = height[0]; max_right[height.length-1] = height[height.length-1]; for(int i = 1; i < height.length; i++){
max_left[i] = Math.max(max_left[i-1], height[i]); } for(int i = height.length - 2; i > 0; i--){
max_right[i] = Math.max(max_right[i+1], height[i]); } for(int i = 1; i < height.length - 1; i++){
ans += Math.min(max_right[i], max_left[i]) - height[i]; } return ans; }}

leetcode solution 3: Using stacks

如果当前高度小于栈顶高度,入栈
否则,pop出栈顶(能蓄水的部分)
新栈顶与当前高度的较小值减去pop出的栈顶高度,为蓄水高度
循环,直到栈空或者当前高度小于栈顶高度

涉及到局部求解的问题可以考虑stack

class Solution {
public int trap(int[] height) {
int ans = 0, current = 0; Stack
st = new Stack<>(); while (current < height.length) {
while (!st.empty() && height[current] > height[st.peek()]) {
int top = st.pop(); if (st.empty()) break; int distance = current - st.peek() - 1; int bounded_height = Math.min(height[current], height[st.peek()]) - height[top]; ans += distance * bounded_height; } st.push(current++); } return ans; }}

leetcode solution 4: Using 2 pointers

性能最佳!!!

class Solution {
public int trap(int[] height) {
int left = 0, right = height.length - 1; int ans = 0; int left_max = 0, right_max = 0; while (left < right) {
if (height[left] < height[right]) {
left_max = Math.max(height[left], left_max); ans += (left_max - height[left]); ++left; } else {
right_max = Math.max(height[right], right_max); ans += (right_max - height[right]); --right; } } return ans; }}

转载地址:http://kbqvb.baihongyu.com/

你可能感兴趣的文章
input /button链接方法
查看>>
CSS,font-family,好看,常用,中文,字体(更新中)
查看>>
struts2跳转后CSS和js失效的问题
查看>>
jenkins使用入门-----常规配置&遇到的坑
查看>>
Git使用基础---基础命令的使用
查看>>
Python3自定义模块导入---小白详解
查看>>
C语言基础---8.const的理解、左值&右值的理解
查看>>
C语言基础---5.数组相关详解:入门(一维数组 & 二维数组 & 应用案例)
查看>>
C语言基础---15.指针&数组名&数组地址&变量对应的加减法---图解篇
查看>>
C语言基础---14.指针数组 & 数组指针---图解篇
查看>>
C语言基础---11.数组相关常见的坑(字符数组、字符指针、strcpy与=区别)
查看>>
C语言基础---12.const使用(数组指针、指针常量,常量指针、常量指针常量、常量数组)
查看>>
Python经典算法(小白入门系列)------选择排序
查看>>
Python经典算法(小白入门系列)------希尔排序
查看>>
Flask-SQLAlchemy分组查询 & 查询后排序 & 更新数据 & 删除数据 ---ORM(6)
查看>>
Linux-----通过定时任务(crontab) 执行shell + python
查看>>
正则---re模块的基础用法(re.match() /单个字符匹配/ 多个字符匹配)
查看>>
Flask_sqlalchemy-------AttributeError: ‘str‘ object has no attribute ‘microseconds‘
查看>>
一次惨痛的教训:被pnscan病毒攻击的经过
查看>>
Redis---基础知识:数据类型、持久化机制、虚拟内存、高级特性、应用场景
查看>>