42. Regen fangen (schwierig)
Berechnen Sie anhand n
einer 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;
};