Algorithmus series-leetcode-42 Empfangen von Regenwasser

42. Regen fangen (schwierig)

Berechnen Sie anhand neiner nicht negativen ganzen Zahl 1, die die Höhenkarte jeder Spalte mit einer Breite von darstellt, wie viel Regenwasser von den so angeordneten Spalten nach dem Regen aufgenommen werden kann.

Beispiel 1:

Eingabe: Höhe = [0,1,0,2,1,0,1,3,2,1,2,1]
 Ausgabe: 6
 Erklärung: Das Obige besteht aus dem Array [0,1,0,2, 1,0 ,1,3,2,1,2,1] stellt die Höhenkarte dar, in diesem Fall kann sie 6 Einheiten Regenwasser aufnehmen (der blaue Teil repräsentiert Regenwasser). 

Beispiel 2:

Eingabe: Höhe = [4,2,0,3,2,5]
 Ausgabe: 9

 dynamische Programmierung

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {
    let n = height.length;
    if (n == 0) {
        return 0;
    }

    let leftMax = new Array(n).fill(0);
    leftMax[0] = height[0];
    for (let i = 1; i < n; ++i) {
        leftMax[i] = Math.max(leftMax[i - 1], height[i]);
    }

    let rightMax = new Array(n).fill(0);
    rightMax[n - 1] = height[n - 1];
    for (let i = n - 2; i >= 0; --i) {
        rightMax[i] = Math.max(rightMax[i + 1], height[i]);
    }

    let res = 0;
    for (let i = 0; i < n; ++i) {
        res += Math.min(leftMax[i], rightMax[i]) - height[i];
    }
    return res;
};

Doppelzeiger

/**
 * @param {number[]} height
 * @return {number}
 */
var trap = function(height) {
    let res = 0;
    let left = 0, right = height.length - 1;
    let leftMax = 0, rightMax = 0;
    while (left < right) {
        leftMax = Math.max(leftMax, height[left]);
        rightMax = Math.max(rightMax, height[right]);
        if (height[left] < height[right]) {
            res += leftMax - height[left];
            ++left;
        } else {
            res += rightMax - height[right];
            --right;
        }
    }
    return res;
};

Ich denke du magst

Origin blog.csdn.net/animatecat/article/details/124416821
Empfohlen
Rangfolge