`
frank-liu
  • 浏览: 1666017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: Trapping Rain Water

 
阅读更多

问题描述:

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!

原问题链接:https://leetcode.com/problems/trapping-rain-water/

 

问题分析

    我们先来看一个最简单的示例,看能否找到思路。在前面问题的要求中,要能够实现有水的存储,那么它最简单的形式也应该是一个凹型的。所以说,对于这个数组来说它至少要有3个元素。也就是说它的长度至少应该为3,否则没法构成这么一个可以储水的结构。

  所以说,一个最简单的储水结构应该如下图:

  针对这种最简单的形式,我们需要有一个左边和一个右边。然后在上图中红线下所覆盖的地方即为它所储水的部分。在这种情况下,很明显,我们应该取两个边中间比较矮的那个。在实际要求中则是要去其中较小的那个值。

  有了上述这个最简单的示例,我们知道一点。如果我们要找里面可以储水的地方,需要首先从两边开始取长度短的一方,然后向长的一方移动来计算。一直到碰到一个比当前的那个长度长的边。在实际的情况中,在向长的边移动的时候,不是所有的边的高度都是0,更可能出现一些如下的情况:

   实际上这种情况也比较简单。如上图中用红线所标注的样式。每次我们可以用当前的那个矮的一边的高度减去当前的值就可以得到一个针对当前单元的储水情况。然后将这些值都加起来。

  所以按照前面的讨论我们就已经得到一个基本的思路了。就是一开始我们首先取数组两头的元素。然后判断小的那个元素作为移动的起始点。向大的元素那边移动。我们以这个小元素的值作为当前的minHeight值。循环向大的元素方向比较移动,碰到比minHeight小的当前元素,则将minHeight - 当前元素的值作为当前储水的一部分累加到一个表示所有储水量的变量中。假设这个变量定义为water。如果碰到比当前minHeight大的元素,则停止向原来方向的移动。我们继续比较两边当前的边的长度,再来选择出一个minHeight作为下一轮移动的标杆。 

   所以按照这个思路,我们在具体的实现的代码中应该定义两个索引,一个left,一个right。left = 0, right = height.length - 1。最外层的循环是while(left < right),保证一直比较到最终两个索引点相遇。假设最开始是左边的索引点小,那么就有

 

while(left < right && height[left] <= minHeight) {
    water += minHeight - height[left];
    left++;
}

  同理,如果是右边的索引点小,那么它向大的元素那边移动的代码如下:

 

while(left < right && height[right] <= minHeight) {
    water += minHeight - height[right];
    right--;
}

     在这两个循环跳出来之后,说明我们已经碰到比minHeight大的点了。所以需要再次求minHeight的值。它的求法还是一样,取left, right两个位置中小的那个。

 

  综合上述的讨论,我们可以得到如下的详细实现代码:

 

public class Solution {
    public int trap(int[] height) {
        if(height == null || height.length < 3) return 0;
        int n = height.length, l = 0, r = n - 1, water = 0, minHeight = 0;
        while (l < r) {
            while (l < r && height[l] <= minHeight)
                water += minHeight - height[l++];
            while (r > l && height[r] <= minHeight)
                water += minHeight - height[r--];
            minHeight = Math.min(height[l], height[r]);
        }
        return water;
    }
}

  

  • 大小: 7.7 KB
  • 大小: 6.6 KB
  • 大小: 7.6 KB
分享到:
评论

相关推荐

    javalruleetcode-LeetCode:LeetCode算法问题

    Trapping Rain Water LeetCode 61 RotateList LeetCode 75 Sort Colors LeetCode 125 Valid Palindrome LeetCode 167 Two Sum II - Input array is sorted LeetCode 344 Reverse String LeetCode 345 Reverse Vowels...

    leetcode1004-leetcode:leetcode删号重练个人记录:)

    leetcode 1004 leetcode NEXT:42 Trapping Rain Water 刷题顺序 刷题内容总的来说包括数据结构、算法和技巧 按照tag分类别进行刷题,跳过like&lt;200&gt;like的题目 按Acceptance由高到低进行,每个tag所刷题目大于20...

    leetcode卡-LeetCode:我的LeetCode解决方案

    Trapping Rain Water II], BFS/Priority queue 2017.06.19 打卡[LeetCode 145. Binary Tree Postorder Traversal], Tree/stack 2017.06.20 打卡[LeetCode 107. Binary Tree Level Order Traversal II], Tree/BFS ...

    lrucacheleetcode-leetcode:leetcode

    Trapping Rain Water 85. Maximal Rectangle Monotonic stack for 2d array 239. Sliding Window Maximum 255. Verify Preorder Sequence in Binary Search Tree 907. Sum of Subarray Minimums 二叉搜索树 99. ...

    leetcode添加元素使和等于-leetcode:我的leetcode解决方案

    leetcode添加元素使和等于 经验教训 一定要吧功能尽量细化为函数,这样一者做题思路比较清晰,二者可以在某些情况下直接return值。 如果输入的形式是一个序列,则可以想想:分治、动规、贪婪,一般不建议搜索,因为...

    leetcode跳跃-leetcode:leetcode解题之路

    接雨水](./Array/trapping-rain-water.md) [0048 旋转图像](./Array/rotate-image.md) Heap 堆 [0023 合并K个排序链表](./Heap/merge-k-sorted-lists.md) String 字符串 [0006 Z字形变换](./String/zigzag-...

    leetcode答案-leetcode:leetcode.com问题的答案

    leetcode 答案leetcode leetcode.com 问题的答案 跑步 python -m venv .venv source .venv/bin/activate pip install -r requirements.txt pytest &lt;question&gt;/tests.py ...lc42_trapping_rain_water/tests.py

    leetcode添加元素使和等于-leetcode:力码

    trapping-rain-water 滑动窗口 通过窗口的大小不断调整来找到合适的值,或者窗口大小不变,通过左右移动来找到相应的结果 \ \ 其他 非 LeetCode 题,单纯在别人面试中看到的 \ 链表 \ swap-nodes-in-pairs linked-...

    Leetcode-Solutions:JavaScript 语言的 Leetcode 解决方案

    力码解决方案 Leetcode是一个网站,人们——...├── Trapping Rain Water │ ├── Readme.md │ └── solution.js ├── Wildcard Matching │ ├── Readme.md │ └── solution.js ├── Valid Number │

    erlang入门级练习:LeetCode OJ问题的部分erlang 源码

    我自己在新学erlang,在LeetCode OJ上找了题目练习,题目很适合新手... "three_sum.erl","trapping_rain_water.erl", "valid_palindrome.erl" 个人认为dungeon_game这个题目解题逻辑很体现erlang的函数式的思维逻辑

    多线程leetcode-leetcode-java:leetcode上的题解,基于java语言

    多线程 leetcode 前言 每天刷点leetcode,基于java语言实现。 leetcode上难度分三档:easy,medium,hard. 如下: easy medium Remove Nth Node From End of List Swap Nodes ...Trapping Rain Water

    LeetCode最全代码

    # [LeetCode](https://leetcode.com/problemset/algorithms/) ![Language](https://img.shields.io/badge/language-Python%20%2F%20C++%2011-orange.svg) [![License]...

    leetcode答案-Algorithms:算法

    leetcode 答案 Algorithms 一、three sum 三数相加问题 问题描述 在一个由 number 组成的数组中,找到所有的 3 个数组成的数组,使得这三个数字的和等于给定的数字 解答 考虑到时间复杂度肯定大于等于 O(n²) 可以先...

    leetcode不会-3D-Trapping-Rain-Water-System:该repo包含复杂3D雨水收集系统的解决方案,该系统在Lee

    leetcode 不会3D 捕集雨水系统 该 repo 包含复杂 3D 雨水收集系统的解决方案,该系统在 Leetcode Problem No. 407 和 Google Interview Round 中提出。 此外,它将“0”视为系统的排水。 (查看自述文件以获得详细...

    收集面试中提出的一些重要问题。-C/C++开发

    收集面试中提出的一些重要问题。 数据结构算法面试问题面试中提出的一些重要问题的集合。...数组https://leetcode.com/problems/3sum/ [解决方案] https://leetcode.com/problems/trapping-rain-water/ [解决方案] ...

    cpp-算法精粹

    Trapping Rain Water Rotate Image Plus One Climbing Stairs Set Matrix Zeroes Gas Station Candy Majority Element Rotate Array Contains Duplicate Contains Duplicate II Contains Duplicate III Product of ...

Global site tag (gtag.js) - Google Analytics