详细见: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))