LeetCode042 Trapping Rain Water

详细见:leetcode.com/problems/trapping-rain-water


很经典


Java Solution: github

package leetcode;

/*
 * 	最大积水问题
 */

public class P042_TrappingRainWater {
	public static void main(String[] args) {
		int[] input = null;
		input = new int[]{0,1,0,2,1,0,1,3,2,1,2,1};
		input = new int[]{2,0,2};
		System.out.println(new Solution2().trap(input));
	}
	/*
	 * 	AC
	 * 	2 ms
	 * 	21.39%
	 */
	static class Solution {
	    public int trap(int[] height) {
	    	if (height == null || height.length < 3)
	    		return 0;
	    	int maxI = 0;
	    	for (int i = 1; i != height.length; i ++)
	    		if (height[i] > height[maxI])
	    			maxI = i;
	    	int[] hori = new int[height.length];
	    	hori[0] = height[0];
	    	hori[maxI] = height[maxI];
	    	hori[height.length - 1] = height[height.length - 1];
	    	int ans = 0;
	    	for (int i = 1; i < maxI; i ++) {
	    		hori[i] = height[i] > hori[i - 1] ? height[i] : hori[i - 1];
	    		ans += hori[i] - height[i];
	    	}
	    	for (int i = height.length - 2; i > maxI; i --) {
	    		hori[i] = height[i] > hori[i + 1] ? height[i] : hori[i + 1];
	    		ans += hori[i] - height[i];
	    	}
	        return ans;
	    }
	}
	/*
	 * 	AC
	 */
	static class Solution2 {
	    public int trap(int[] height) {
	    	if (height == null || height.length < 3)
	    		return 0;
	    	int maxI = 0;
	    	for (int i = 1; i != height.length; i ++)
	    		if (height[i] > height[maxI])
	    			maxI = i;
	    	int ans = 0, pre = height[0];
	    	for (int i = 1; i < maxI; i ++) {
	    		pre = height[i] > pre ? height[i] : pre;
	    		ans += pre - height[i];
	    	}
	    	pre = height[height.length - 1];
	    	for (int i = height.length - 2; i > maxI; i --) {
	    		pre = height[i] > pre ? height[i] : pre;
	    		ans += pre - height[i];
	    	}
	        return ans;
	    }
	}
}


C Solution: github

/*
    url: leetcode.com/problems/trapping-rain-water/
    AC 6ms 50.00%
*/

#include <stdio.h>
#include <stdlib.h>

int trap(int* h, int s) {
    int mi = 0, i = 0;
    int j = 0;
    long ans = 0;
    for (i = 0; i < s; i ++)
        if (h[mi] < h[i])
            mi = i;
    i = 0;
    while (i < mi) {
        for (j = i + 1; j <= mi; j ++) {
            if (h[j] > h[i]) break;
            ans += h[i] - h[j];
        }
        i = j;
    }
    i = s - 1;
    while (i > mi) {
        for (j = i - 1; j >= mi; j --) {
            if (h[j] > h[i]) break;
            ans += h[i] - h[j];
        }
        i = j;
    }
    return (int)ans;
}

int main() {
    int h[] = {0,1,0,2,1,0,1,3,2,1,2,1};
    int s = 12;
    printf("answer is %d\r\n", trap(h, s));
}

Python Solution: github


#coding=utf-8

'''
    url: leetcode.com/problems/trapping-rain-water
    @author:     zxwtry
    @email:      zxwtry@qq.com
    @date:       2017年4月6日
    @details:    Solution: 65ms 42.44%
'''

class Solution(object):
    def trap(self, h):
        """
        :type h: List[int]
        :rtype: int
        """
        hn = 0 if h == None else len(h)
        if hn == 0: return 0
        mi, m1, m2, ans = 0, h[0], h[hn-1], 0
        for i in range(1, hn):
            if h[i] > h[mi]:
                mi = i
        for k in range(1, mi):
            ans += max(m1 - h[k], 0)
            m1 = max(h[k], m1)
        for k in range(hn-2, mi, -1):
            ans += max(m2 - h[k], 0)
            m2 = max(h[k], m2)
        return ans
    
if __name__ == "__main__":
    h=[0,1,0,2,1,0,1,3,2,1,2,1]
    print(Solution().trap(h))
            


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值