zoukankan      html  css  js  c++  java
  • 数组可以容纳多少水----------给你出道题

    这个问题好像是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来表示.

  • 相关阅读:
    DOM-DOMTree-查找

    用sql语句操作数据库
    数据查询基础
    【案例】城市地址三级联动
    【案例】城市地址二级联动
    【案例】高仿百度注册页
    【案例】自由运动小球
    【案例】使用上下左右键控制元素的移动
    事件
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/6175594.html
Copyright © 2011-2022 走看看