经典算法题计算积水面积——python
原题:给定一个整数数组,假设元素都是厚为1的挡板,往里面倒水,计算盛水的最大横截面积。 算法1思路:
- 实现思路:每次看到一个元素,就往回看会增加多少积水
- 时间复杂度,每遍历一个元素都有可能回看所有已经出现的元素,所以是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 < 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 > 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相关推荐
- python全排序算法题_Python的100道经典算法题(1)
按照c语言的100道经典算法题,自己原创写的,就得是自己的练习题了 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 程序分析:可填在百位.十位.个位的数 ...
- 经典算法题每日演练——第六题 协同推荐SlopeOne 算法
原文:经典算法题每日演练--第六题 协同推荐SlopeOne 算法 相信大家对如下的Category都很熟悉,很多网站都有类似如下的功能,"商品推荐","猜你喜欢&quo ...
- java经典100例算法题_10道java经典算法题,每一题都能帮你提升java水平!
JAVA经典算法题 [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析:兔子 ...
- 经典算法题每日演练——第七题 KMP算法
原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树 ...
- 每日经典算法题(十三) 逆推算法(平方根相关)
每日经典算法题(十三) 逆推算法(平方根相关) 平方根:Square Root 题目 有一个整数,它加上 100 后是一个 完全平方数 ,再加上 168 又是一个 完全平方数 ,请问该数是多少? 程序 ...
- 【经典算法题】Pow(x, n)
[经典算法题]Pow(x, n) Leetcode 0050 Pow(x, n) 题目描述:Leetcode 0050 Pow(x, n) 分析 本题的考点:快速幂. 关于快速幂的讲解可以参考:快速幂 ...
- 字节跳动经典算法题:给定一个数n如23121;给定一组数字a如[2 4 9]求由a中元素组成的小于n的最大数
字节跳动经典算法题(提问次数最多) 题目描述:给定一个数n如23121:给定一组数字a,如[2 4 9]:求由a中元素组成的小于n的最大数. 思路分析:暴力分析手法 1. 判断该位的数值是否在数字a中 ...
- 经典算法题每日演练——第二十二题 奇偶排序
原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个&qu ...
- 经典算法题每日演练——第十九题 双端队列
经典算法题每日演练--第十九题 双端队列 原文:经典算法题每日演练--第十九题 双端队列 话说大学的时候老师说妹子比工作重要~,工作可以再换,妹子这个...所以...这两个月也就一直忙着Fall in ...
最新文章
- 难以想象!未来十年,颠覆性技术将带来这些社会变革……
- PHP学习笔记-字符串操作1
- Windows 8 :妥协的产物
- php解密 码表,php拼音码表的生成
- python中赋值运算符有哪些_Python代码中有哪些赋值运算符呢?
- python socket模块作用_python之socket模块详解--小白博客
- linux of命令,Linux命令(30):isof
- 闲人闲谈PS之九——项目定义及WBS结构设计
- 汇编dos系统调用(输入输出篇)
- 蛋白质组学数据分析实践
- centos7 播放网页flash视频
- 孩子的编程启蒙好伙伴,自己动手打造小世界,长毛象教育AI百变编程积木套件上手
- 著名的NP问题:TSP问题(Traveling Salesman Problem)
- WIN10进不了BIOS的解决办法
- buu crypto 变异凯撒
- Git-fatal: unable to access ‘https://gitlab.XX.git/‘: Could not resolve host: gitlab.XX.com.cn
- Java常见面试题(181-200)
- 配置管理是作什么的?
- Python数据挖掘项目:构建随机森林算法模型预测分析泰坦尼克号幸存者数据
- 处理window11无法连接网络共享打印机
热门文章
- Bugku WEB decrypt
- 医嘱共享与his系统和医保服务器,事半功倍!医院HIS系统下连带医嘱组合是如何工作的?...
- iOS开发判断当前系统版本
- Linux C flie操作: open write read lseek close函数分析
- 子网掩码,网络ID,IP之间关系
- 如何应对各种乱码问题
- Ubuntu 检测不到U盘以及u盘不可用的解决
- android 输入法 确定按钮,Android项目:输入法软键盘显示/隐藏的监听和控制,InputMethodManager用法研究...
- 本硕博参考文献endnote插入,作者名全是大写怎么改。方法有2种
- 前端学习便捷软件,插件