这个问题好像是2015年百度机试题.
问题描述
给定一个数组a[N],可以画一个柱状图.天上下了一场大雨,这个柱状图里面盛了很多雨水,问盛了多少体积的雨水.要求只扫描一次数组.
样例
1 2 3 输出为0
2 1 4 输出为1 4 1 3 输出为2思路
类似快速排序,双指针移动
代码
import randomdef 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 sdef 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 ansfor i in range(100): a = another_data() assert mine(a) == correct_ans(a)
留个课后思考题,如果是一个二维的数组,求雨水的体积?如果是n维的数组呢?n维数组可以用numpy中的ndarray来表示.