Python 板


LINE

※ 引述《joe1234wu ()》之铭言: : 想请教大家.... : 最近遇到一个问题 : 情境会变成 : 有个数列 : ex: [15, 46, 60, 23, 15, 19, 1, 22, 45, 38] : 我要如何找到 Max and min 使得 Max-min 最大 : 但是 Max 必须在min 的右边 : 以上面的例子为例 : 就是 Max = 60 min = 15( 因为 60-15 = 45会是最大) : 我有想过 O(n^2)的方式 就是每次index 当最小值 然後往右找最大 : 最後在看哪个最小 : 但是有没有更好或是更快的方法? : 感谢 提供一个 O(n) 解法 想法: Greedy 的概念,在走访数列 data 的过程中 假设目前找到的最佳解为 (min, max),目前走到第 i 个元素 1. 若 data[i] > max 则可以直接更新最佳解为 (min, data[i]) 2. 若 data[i] < min 此情形能推测,若之後又出现一个更大的值 x x - data[i] > x - min 必定会成立 换句话说,用 data[i] 当 min 去往後找 一定比 用目前的 min 往後找 还更好 因此将目前的 (min, max) 列为解答候选人之一 然後改用 (data[i], data[i]) 继续往後找 (相当於不管前面了直接从这里开始) 3. 其他情况: 不会影响最佳解 走访完後,检查所有解答候选人,最佳的即为答案 实作时只要维护一个指标指向 目前最佳解的 min 然後走访 data 时,假设当前走到的元素是 max 去更新解答 若当前元素 < 目前最佳解的 min 则更新指向 min 的指标指向当前元素 即可 这样讲实在很抽象,直接看 code data = [15, 46, 60, 23, 15, 19, 1, 22, 45, 38] p = 0 # 目前最佳解的 min 的索引值 ans = (0, 0) # (min, max) for i in range(len(data)): if data[i] < data[p]: p = i # 更新最佳解的 min 的索引值 elif data[i] - data[p] > data[ans[1]] - data[ans[0]]: ans = (p, i) # 更新解答 print('min = data[%s] = %s' % (ans[0], data[ans[0]])) print('max = data[%s] = %s' % (ans[1], data[ans[1]])) '''output min = data[0] = 15 max = data[2] = 60 ''' code 解说 & 拿范例来跑一次 初始化 p = 0 # 目前最佳解的最小值的索引值 (data[p] = 上面提到的 min) ans = (0, 0) # 记录解答 min, max 的索引值 ---------------------------------------------------------------------- i=0 p 15, 46, 60, 23, 15, 19, 1 , 22, 45, 38 i 1. data[i] < data[p] 不成立 2. data[i] - data[p] > data[ans[1]] - data[ans[0]] 不成立 ---------------------------------------------------------------------- i=1 p 15, 46, 60, 23, 15, 19, 1 , 22, 45, 38 i 1. data[i] < data[p] 不成立 2. data[i] - data[p] > data[ans[1]] - data[ans[0]] 成立 -> 更新 ans = (0, 1) ---------------------------------------------------------------------- i=2 p 15, 46, 60, 23, 15, 19, 1 , 22, 45, 38 i 1. data[i] < data[p] 不成立 2. data[i] - data[p] > data[ans[1]] - data[ans[0]] 成立 -> 更新 ans = (0, 2) ---------------------------------------------------------------------- i=3 p 15, 46, 60, 23, 15, 19, 1 , 22, 45, 38 i 1. data[i] < data[p] 不成立 2. data[i] - data[p] > data[ans[1]] - data[ans[0]] 不成立 ---------------------------------------------------------------------- i=4 p 15, 46, 60, 23, 15, 19, 1 , 22, 45, 38 i 1. data[i] < data[p] 不成立 2. data[i] - data[p] > data[ans[1]] - data[ans[0]] 不成立 ---------------------------------------------------------------------- i=5 p 15, 46, 60, 23, 15, 19, 1 , 22, 45, 38 i 1. data[i] < data[p] 不成立 2. data[i] - data[p] > data[ans[1]] - data[ans[0]] 不成立 ---------------------------------------------------------------------- i=6 p 15, 46, 60, 23, 15, 19, 1 , 22, 45, 38 i 1. data[i] < data[p] 成立 -> 之後若出现一个大数字 x 则 x - data[i] > x - data[p] 必成立 因此更新 p = i = 6 2. data[i] - data[p] > data[ans[1]] - data[ans[0]] 不成立 ---------------------------------------------------------------------- i=7 p 15, 46, 60, 23, 15, 19, 1 , 22, 45, 38 i 1. data[i] < data[p] 不成立 2. data[i] - data[p] > data[ans[1]] - data[ans[0]] 不成立 好啦後面都是不成立就不再浪费篇辐了XD 最後取出 ans 即为找到的 min, max -- 光明 的背後 是 黑暗 黑暗 的背後 还是 黑暗 由此可知 黑暗 > 光明 Q.E.D. --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.235.135
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Python/M.1439833943.A.26E.html
1F:推 joe1234wu: 感谢!!! 这篇实在是太详细解说了!!! 感谢大大解惑 08/18 10:50
2F:→ joe1234wu: 这样的确可以O(n)就一次找完 那个p 真的是太聪明了!! 08/18 10:51
3F:推 alibuda174: 推 08/18 13:39







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP