LeetCode 42. Trapping Rain Water--算法题--c++解法

LeetCode 42. Trapping Rain Water–c++解法


LeetCode题解专栏:LeetCode题解
LeetCode 所有题目总结:LeetCode 所有题目总结
大部分题目C++,Python,Java的解法都有。


题目地址:


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.
LeetCode 42. Trapping Rain Water--算法题--c++解法_第1张图片

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

这道题目跟第84题很类似,没做的可以先看这篇文章:LeetCode hard 84. Largest Rectangle in Histogram–python,java 15行,c++ 15行 解法


这道题目是非常经典的一道题目,我记得字节跳动和百度都出过这道编程题。
最容易想到的是求两边的最大值,然后比较,时间复杂度为O(n)。
C++解法如下:

class Solution {
public:
    int trap(vector<int> &height) {
        if (height.empty()){
            return 0;
        }
           
        int ans = 0;
        int size = height.size();
        vector<int> left_max(size), right_max(size);
        left_max[0] = height[0];
        for (int i = 1; i < size; i++) {
            left_max[i] = max(height[i], left_max[i - 1]);
        }
        right_max[size - 1] = height[size - 1];
        for (int i = size - 2; i >= 0; i--) {
            right_max[i] = max(height[i], right_max[i + 1]);
        }
        for (int i = 1; i < size - 1; i++) {
            ans += min(left_max[i], right_max[i]) - height[i];
        }
        return ans;
    }
};

c++两边往中间夹的解法:

class Solution {
    public int trap(int[] height) {
        // time : O(n)
        // space : O(1)
        if (height.length==0) return 0; 
        int left = 0, right = height.length-1; 
        int leftMax=0, rightMax=0; 
        int ans = 0; 
        while (left < right) {
            if (height[left] > leftMax) leftMax = height[left]; 
            if (height[right] > rightMax) rightMax = height[right];
            if (leftMax < rightMax) {
                ans += Math.max(0, leftMax-height[left]); 
                left++; 
            } else {
                ans += Math.max(0, rightMax-height[right]); 
                right--; 
            }
        }
        return ans; 
    }
}

你可能感兴趣的:(LeetCode,c++-做题)