leecode42

所与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;
}
公開された48元の記事 ウォンの賞賛5 ビュー751

おすすめ

転載: blog.csdn.net/weixin_43899266/article/details/104320051