题目:接雨水

难度: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.


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!

Example:

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

翻译:简单翻译下就是,给出每一格木块的数量,最后求得这些木块放在一起时能接住多少雨水。

我的思路:此题和第11题很像:Container With Most Water,但是11题里是竖线,这里是方块,而且那是寻求所接水最多的,这里是求所能接住的所有水,不过取水的思想可以参考一下,就是利用双指针,同向移动。每次移动两边比较矮的那一个。

     然而,因为考虑到要减去方体的体积,我还是不会做这个。

 

答案代码

     public int trap(int[] height) {
if (height.length == 0) return 0;
int left = 0;
int right = height.length - 1;
int area = 0, leftHeight = height[0], rightHeight = height[height.length - 1];
while (left < right){
if (height[left] < height[right]){
left++;
leftHeight = Math.max(leftHeight, height[left]);
area += leftHeight - height[left];
}
else{
right--;
rightHeight = Math.max(rightHeight, height[right]);
area += rightHeight - height[right];
}
}
return area;
}

答案复杂度:O(N)

答案思路:果然,是利用了双指针,每次移动比较矮的那一边。

然后,重点来了!

如果移动后的当前高度比移动的这一方的最高的高度要矮,那么储水的量就要加上他们之间的这个差值。

举个例子:(以【】代替方块,___代表0个方块)

【】

【】             【】

【】_________【】【】

A        B    C

首先因为A比C高,所以移动C那边的指针right,right移动到B点,然后取 high[right]  (B)与 之前的最高高度 C 比较,得到还是C高,而因为这边是矮的迟早对面会比这个高,所以此时储水量就应该加上(C-B)。【每移动一格储水量加上移动的这一格能接的水】

而如果当前移动后就是最高的高度,那么储水量则不增加。

所以最后每次移动后,储水量应该加上   ( 此方向的最高高度  -   当前高度 ),对应代码: area += leftHeight - height[left];

本题代码结构和11题Container With Most Water还是有些区别:

1. 多了两边的最高高度记录(eg.rightHeight);

2.本题是先比较左右高矮,移动之后再计算移动产生的盛水量,11题是每次先计算了当前总盛水量再比较看移动那一边。

LeetCode第[42]题(Java):Trapping Rain Water (数组方块盛水)——HARD的更多相关文章

  1. 【LeetCode每天一题】Trapping Rain Water(获得雨水的容量)

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  2. [LeetCode][Java] Trapping Rain Water

    题意: Given n non-negative integers representing an elevation map where the width of each bar is 1, co ...

  3. [LeetCode] 42. Trapping Rain Water 收集雨水

    Given n non-negative integers representing an elevation map where the width of each bar is 1, comput ...

  4. [Leetcode][Python]42: Trapping Rain Water

    # -*- coding: utf8 -*-'''__author__ = 'dabay.wang@gmail.com' 42: Trapping Rain Waterhttps://oj.leetc ...

  5. leetcode#42 Trapping rain water的五种解法详解

    leetcode#42 Trapping rain water 这道题十分有意思,可以用很多方法做出来,每种方法的思想都值得让人细细体会. 42. Trapping Rain WaterGiven n ...

  6. [array] leetcode - 42. Trapping Rain Water - Hard

    leetcode - 42. Trapping Rain Water - Hard descrition Given n non-negative integers representing an e ...

  7. [LeetCode] 接雨水,题 Trapping Rain Water

    这题放上来是因为自己第一回见到这种题,觉得它好玩儿 =) Trapping Rain Water Given n non-negative integers representing an eleva ...

  8. LeetCode 42. Trapping Rain Water 【两种解法】(python排序遍历,C++ STL map存索引,时间复杂度O(nlogn))

    LeetCode 42. Trapping Rain Water Python解法 解题思路: 本思路需找到最高点左右遍历,时间复杂度O(nlogn),以下为向左遍历的过程. 将每一个点的高度和索引存 ...

  9. 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 用双指针向中间滑动,较小的高度就作为当前情 ...

随机推荐

  1. C# 矩阵乘法实现

    矩阵乘法是一种高效的算法可以把一些一维递推优化到log( n ),还可以求路径方案等,所以更是是一种应用性极强的算法.矩阵,是线性代数中的基本概念之一.一个m×n的矩阵就是m×n个数排成m行n列的一个 ...

  2. Numba makes Python code fast

    Numba: A High Performance Python Compiler http://numba.pydata.org/ 一行代码让python的运行速度提高100倍,你信吗?-聚能聊-云 ...

  3. GetWindowThreadProcessId

    函数功能:该函数返回创建指定窗口线程的标识和创建窗口的进程的标识符,后一项是可选的. 函数原型:DWORD GetWindowThreadProcessld(HWND hwnd,LPDWORD lpd ...

  4. 【sed / awk脚本编写】

    awk awk分为BEGIN部分,正则匹配部分,END部分三部分. 我一般在BEGIN部分定义一些变量,正则部分用于匹配和执行一些解析和统计,END部分用于输出结果. 总体结构: awk 'BEGIN ...

  5. 使用win32ole进行页面加载和跳转

    require "win32ole" #包含库 ie = WIN32OLE.new('internetExplorer.Application') ie.visible = tru ...

  6. 利用Docker快速部署Oracle环境

    工作中需要频繁使用Oracle环境,但是每次搭建起来比较消耗时间,本想通过虚拟机模板的方式来快速安装oracle vm,但是每次改ip等环境也很耗时,因此想到docker中有没有已经做好的images ...

  7. 查看Oracle的表中有哪些索引

    用user_indexes和user_ind_columns系统表查看已经存在的索引 对于系统中已经存在的索引我们可以通过以下的两个系统视图(user_indexes和user_ind_columns ...

  8. golang的极简流式编程实现

    传统的过程编码方式带来的弊端是显而易见,我们经常有这样的经验,一段时间不维护的代码或者别人的代码,突然拉回来看需要花费较长的时间,理解原来的思路,如果此时有个文档或者注释写的很好的话,可能花的时间会短 ...

  9. C# 复杂算法

    1.添加命名空间引用using Microsoft.JScript; //formula 是公式如:(1+2)*3/10 private double GetComputeValueByStringF ...

  10. JavaScript:判断当前浏览器是否为微信浏览器

    <script type="text/javascript"> function CheckWeChatBrowser() { var ua = navigator.u ...