原题:给定一个整数数组,假设元素都是厚为1的挡板,往里面倒水,计算盛水的最大横截面积。 算法1思路:

  1. 实现思路:每次看到一个元素,就往回看会增加多少积水
  2. 时间复杂度,每遍历一个元素都有可能回看所有已经出现的元素,所以是O(n^2)
def cal_water(array):if not array: return 0rtv, max_v = 0, array[0]for idx, value in enumerate(array[1:]):ridx = idxlocal_max = array[ridx]while value > local_max and local_max != max_v:rtv += min(value, max_v) - local_maxridx -= 1local_max = max(local_max, array[ridx])max_v = max(max_v, value)return rtv

算法2思路: 1.实现思路,找到最大元素,然后分北坡和南坡计算积水面积
2.时间复杂度NlogN

def south_area(arr, idx):if idx <= 1:return 0i = idx - 1south_index, south_max = i, arr[i]while i >= 0:if arr[i] > south_max:south_index, south_max = i, arr[i]i -= 1
rtv = 0
i = south_index
while i &lt; idx:rtv += south_max - arr[i]i += 1
return rtv + south_area(arr, south_index)

def north_area(arr, idx):
if idx >= len(arr) - 1:
return 0
i = idx + 1
north_index, north_max = i, arr[i]
while i < len(arr):
if arr[i] > north_max:
north_index, north_max = i, arr[i]
i += 1

rtv = 0
i = north_index
while i &gt; idx:rtv += north_max - arr[i]i -= 1
return rtv + north_area(arr, north_index)

def water_area(arr):
if len(arr) <= 1:
return 0
max_index, max_value = 0, arr[0]
for index, value in enumerate(arr):
if value > max_value:
max_index, max_value = index, value
return south_area(arr, max_index) + north_area(arr, max_index)

测试用例

for i in range(20):array = random.sample(range(20), random.randint(1, 20))print 'array: ', arrayprint 'cal_water: ', cal_water(array)print 'water_area: ', water_area(array)print '================================='

此处进行了10组数据的模拟,大家可以肉眼验证其正确性

经典算法题计算积水面积——python相关推荐

  1. python全排序算法题_Python的100道经典算法题(1)

    按照c语言的100道经典算法题,自己原创写的,就得是自己的练习题了 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数 ...

  2. 经典算法题每日演练——第六题 协同推荐SlopeOne 算法

    原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,"商品推荐","猜你喜欢&quo ...

  3. java经典100例算法题_10道java经典算法题,每一题都能帮你提升java水平!

    JAVA经典算法题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子 ...

  4. 经典算法题每日演练——第七题 KMP算法

    原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...

  5. 每日经典算法题(十三) 逆推算法(平方根相关)

    每日经典算法题(十三) 逆推算法(平方根相关) 平方根:Square Root 题目 有一个整数,它加上 100 后是一个 完全平方数 ,再加上 168 又是一个 完全平方数 ,请问该数是多少? 程序 ...

  6. 【经典算法题】Pow(x, n)

    [经典算法题]Pow(x, n) Leetcode 0050 Pow(x, n) 题目描述:Leetcode 0050 Pow(x, n) 分析 本题的考点:快速幂. 关于快速幂的讲解可以参考:快速幂 ...

  7. 字节跳动经典算法题:给定一个数n如23121;给定一组数字a如[2 4 9]求由a中元素组成的小于n的最大数

    字节跳动经典算法题(提问次数最多) 题目描述:给定一个数n如23121:给定一组数字a,如[2 4 9]:求由a中元素组成的小于n的最大数. 思路分析:暴力分析手法 1. 判断该位的数值是否在数字a中 ...

  8. 经典算法题每日演练——第二十二题 奇偶排序

    原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个&qu ...

  9. 经典算法题每日演练——第十九题 双端队列

    经典算法题每日演练--第十九题 双端队列 原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in ...

最新文章

  1. 难以想象!未来十年,颠覆性技术将带来这些社会变革……
  2. PHP学习笔记-字符串操作1
  3. Windows 8 :妥协的产物
  4. php解密 码表,php拼音码表的生成
  5. python中赋值运算符有哪些_Python代码中有哪些赋值运算符呢?
  6. python socket模块作用_python之socket模块详解--小白博客
  7. linux of命令,Linux命令(30):isof
  8. 闲人闲谈PS之九——项目定义及WBS结构设计
  9. 汇编dos系统调用(输入输出篇)
  10. 蛋白质组学数据分析实践
  11. centos7 播放网页flash视频
  12. 孩子的编程启蒙好伙伴,自己动手打造小世界,长毛象教育AI百变编程积木套件上手
  13. 著名的NP问题:TSP问题(Traveling Salesman Problem)
  14. WIN10进不了BIOS的解决办法
  15. buu crypto 变异凯撒
  16. Git-fatal: unable to access ‘https://gitlab.XX.git/‘: Could not resolve host: gitlab.XX.com.cn
  17. Java常见面试题(181-200)
  18. 配置管理是作什么的?
  19. Python数据挖掘项目:构建随机森林算法模型预测分析泰坦尼克号幸存者数据
  20. 处理window11无法连接网络共享打印机

热门文章

  1. Bugku WEB decrypt
  2. 医嘱共享与his系统和医保服务器,事半功倍!医院HIS系统下连带医嘱组合是如何工作的?...
  3. iOS开发判断当前系统版本
  4. Linux C flie操作: open write read lseek close函数分析
  5. 子网掩码,网络ID,IP之间关系
  6. 如何应对各种乱码问题
  7. Ubuntu 检测不到U盘以及u盘不可用的解决
  8. android 输入法 确定按钮,Android项目:输入法软键盘显示/隐藏的监听和控制,InputMethodManager用法研究...
  9. 本硕博参考文献endnote插入,作者名全是大写怎么改。方法有2种
  10. 前端学习便捷软件,插件