42. Trapping Rain Water

LeetCode hard original: C# #array #csharp #hard #leetcode #math #two-pointers
선택한 UI 언어에 맞게 문제 텍스트를 러시아어에서 번역합니다. 코드는 변경하지 않습니다.

given n неотрицательных целых чисел, представляющих карту высот, где ширина каждого столбца равна 1. Вычислите, сколько воды он может удержать после дождя.

예제:

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

Output: 6

C# 해법

매칭됨/원본
public class Solution {
    public int Trap(int[] height) {
        if (height.Length == 0)
            return 0;
        int ans = 0;
        int size = height.Length;
        int[] left_max = new int[size];
        int[] right_max = new int[size];
        left_max[0] = height[0];
        for (int i = 1; i < size; i++) {
            left_max[i] = Math.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] = Math.Max(height[i], right_max[i + 1]);
        }
        for (int i = 1; i < size - 1; i++) {
            ans += Math.Min(left_max[i], right_max[i]) - height[i];
        }
        return ans;
    }
}

C++ 해법

자동 초안, 제출 전 검토
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public int Trap(vector<int>& height) {
        if (height.size() == 0)
            return 0;
        int ans = 0;
        int size = height.size();
        vector<int>& left_max = new int[size];
        vector<int>& right_max = new int[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;
    }
}

Java 해법

매칭됨/원본
class Solution {
    public int trap(int[] height) {
        if (height.length == 0) return 0;
        int ans = 0;
        int size = height.length;
        int[] left_max = new int[size];
        int[] right_max = new int[size];
        left_max[0] = height[0];
        for (int i = 1; i < size; i++) {
            left_max[i] = Math.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] = Math.max(height[i], right_max[i + 1]);
        }
        for (int i = 1; i < size - 1; i++) {
            ans += Math.min(left_max[i], right_max[i]) - height[i];
        }
        return ans;
    }
}

JavaScript 해법

매칭됨/원본
var trap = function (height) {
    if (height.length == 0) return 0;
    let ans = 0;
    let size = height.length;
    let left_max = new Array(size).fill(0),
        right_max = new Array(size).fill(0);
    left_max[0] = height[0];
    for (let i = 1; i < size; i++) {
        left_max[i] = Math.max(height[i], left_max[i - 1]);
    }
    right_max[size - 1] = height[size - 1];
    for (let i = size - 2; i >= 0; i--) {
        right_max[i] = Math.max(height[i], right_max[i + 1]);
    }
    for (let i = 1; i < size - 1; i++) {
        ans += Math.min(left_max[i], right_max[i]) - height[i];
    }
    return ans;
};

Python 해법

매칭됨/원본
class Solution:
    def trap(self, height: List[int]) -> int:
        if len(height) == 0:
            return 0
        ans = 0
        size = len(height)
        left_max, right_max = [0] * size, [0] * size
        left_max[0] = height[0]
        for i in range(1, size):
            left_max[i] = max(height[i], left_max[i - 1])
        right_max[size - 1] = height[size - 1]
        for i in range(size - 2, -1, -1):
            right_max[i] = max(height[i], right_max[i + 1])
        for i in range(1, size - 1):
            ans += min(left_max[i], right_max[i]) - height[i]
        return ans

Go 해법

매칭됨/원본
func trap(height []int) int {
    if len(height) == 0 {
        return 0
    }
    ans := 0
    size := len(height)
    left_max, right_max := make([]int, size), make([]int, size)
    left_max[0] = height[0]
    for i := 1; i < size; i++ {
        if height[i] > left_max[i-1] {
            left_max[i] = height[i]
        } else {
            left_max[i] = left_max[i-1]
        }
    }
    right_max[size-1] = height[size-1]
    for i := size - 2; i >= 0; i-- {
        if height[i] > right_max[i+1] {
            right_max[i] = height[i]
        } else {
            right_max[i] = right_max[i+1]
        }
    }
    for i := 1; i < size-1; i++ {
        if left_max[i] < right_max[i] {
            ans += left_max[i] - height[i]
        } else {
            ans += right_max[i] - height[i]
        }
    }
    return ans
}

Algorithm

1️⃣

find максимальную высоту столбца с левого конца до индекса i в 배열е left_max.

2️⃣

find максимальную высоту столбца с правого конца до индекса i в 배열е right_max.

3️⃣

Итерируйте по 배열у высот height и обновляйте ans: добавьте min(left_max[i], right_max[i]) - height[i] к ans.

😎

Vacancies for this task

활성 채용 with overlapping task tags are 표시됨.

전체 채용
아직 활성 채용이 없습니다.