zoukankan      html  css  js  c++  java
  • [LintCode] 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.

    Trapping Rain Water

    Example

    Given [0,1,0,2,1,0,1,3,2,1,2,1], return 6.

    Challenge 

    O(n) time and O(1) memory

    O(n) time and O(n) memory is also acceptable.

    LeetCode上的原题,请参见我之前的博客Trapping Rain Water

    解法一:

    class Solution {
    public:
        /**
         * @param heights: a vector of integers
         * @return: a integer
         */
        int trapRainWater(vector<int> &heights) {
            int res = 0, mx = 0, n = heights.size();
            vector<int> dp(n, 0);
            for (int i = 0; i < n; ++i) {
                dp[i] = mx;
                mx = max(mx, heights[i]);
            }
            mx = 0;
            for (int i = n - 1; i >= 0; --i) {
                dp[i] = min(dp[i], mx);
                mx = max(mx, heights[i]);
                if (dp[i] > heights[i]) res += dp[i] - heights[i];
            }
            return res;
        }
    };

    解法二:

    class Solution {
    public:
        /**
         * @param heights: a vector of integers
         * @return: a integer
         */
        int trapRainWater(vector<int> &heights) {
            int res = 0, l = 0, r = heights.size() - 1;
            while (l < r) {
                int mn = min(heights[l], heights[r]);
                if (mn == heights[l]) {
                    ++l;
                    while (l < r && heights[l] < mn) {
                        res += mn - heights[l++];
                    }
                } else {
                    --r;
                    while (l < r && heights[r] < mn) {
                        res += mn - heights[r--];
                    }
                }
            }
            return res;
        }
    };

    解法三:

    class Solution {
    public:
        /**
         * @param heights: a vector of integers
         * @return: a integer
         */
        int trapRainWater(vector<int> &heights) {
            int res = 0, l = 0, r = heights.size() - 1, level = 0;
            while (l < r) {
                int lower = heights[(heights[l] < heights[r]) ? l++ : r--];
                level = max(level, lower);
                res += level - lower;
            }
            return res;
        }
    };
  • 相关阅读:
    fiddler 使用
    IO多路复用
    scrapy下载 大文件处理

    session见解
    自定义分页
    COOKIE
    ORM之老师管理
    ORM之学生管理
    ORM之班级管理
  • 原文地址:https://www.cnblogs.com/grandyang/p/6166347.html
Copyright © 2011-2022 走看看