这个问题好像是2015年百度机试题.
问题描述
给定一个数组a[N],可以画一个柱状图.天上下了一场大雨,这个柱状图里面盛了很多雨水,问盛了多少体积的雨水.要求只扫描一次数组.
样例
1 2 3 输出为0
2 1 4 输出为1
4 1 3 输出为2
思路
类似快速排序,双指针移动
代码
import random
def another_data():
return [random.randint(0, 10) for i in range(500)]
def correct_ans(a):
s = 0
for i in range(len(a)):
left = max(a[0:i]) if i > 0 else 0
right = max(a[i + 1:len(a)]) if i < len(a) - 1 else 0
if min(left, right) < a[i]:
continue
else:
s += min(left, right) - a[i]
return s
def mine(a):
s = 0
ans = 0
left, right = 0, len(a) - 1
while left < right:
# print(a,left,right,ans,s)
if a[left] < a[right]:
i = left
while i < right and a[i] <= a[left]:
s += a[i]
i += 1
ans += (i - left) * min(a[left], a[i]) - s
s = 0
left = i
else:
i = right
while i > left and a[i] <= a[right]:
s += a[i]
i -= 1
ans += (right - i) * min(a[right], a[i]) - s
s = 0
right = i
return ans
for i in range(100):
a = another_data()
assert mine(a) == correct_ans(a)
留个课后思考题,如果是一个二维的数组,求雨水的体积?如果是n维的数组呢?n维数组可以用numpy中的ndarray来表示.