所与nはずっと雨雨を取ることができ、次いで高さマップ算出クリック列配置、幅1列の非負整数を表します。
上記配列[0,1,0,2,1,0,1,3,2,1,2,1】図は非常に表される、この場合には、取ることができる6つのユニットの雨水(青部分)が雨を表します。この図にマルコスの貢献をありがとうございます。
例:
入力:[0,1,0,2,1,0,1,3,2,1,2,1]
出力:6
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/trapping-rain-water
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。
雨水ハハ、単調増加スタック(スタックの下から上へのスタック)を使用してアイデア:高さ[i]は上部要素(高さ[スタック[トップ])の> =高さ 、 判断力、注意:トップ> = 1時だけで比較し、貧しい人々に意味をなします。
図3は、例えば、I =、高さ[3] = 2、 及び高さ[スタック[トップ] = 0 、 スタック[トップ- - 1]この場合は、iの幅である - 1、 高さ分(高さ[I] -スタック [ トップ]、スタック[トップ- 1 ] -スタック[トップ])、 結果ANS + = H、及び、スタック(TOP-場所)×W、次いでスタックにプッシュ。
int trap(int* height, int heightSize){
int ans = 0, top = -1;
int *stack = (int *)malloc(sizeof(int) * heightSize);
for (int i = 0; i < heightSize; i++) {
while (top != -1 && height[stack[top]] <= height[i]) {
if (top >= 1) {
int w = i - stack[top - 1] - 1;
int val1 = height[i] - height[stack[top]];
int val2 = height[stack[top - 1]] - height[stack[top]];
int h = (val1 < val2 ? val1 : val2);
ans += h * w;
}
top--;
}
stack[++top] = i;
}
free(stack);
return ans;
}