作者 |
戴助教+本助教
编辑 | Cecily
专栏 | 九章算法
1. 给定一支股票每天的价格以及进行一次卖出所需要的交易费,每次最多只能拥有 一支股票,问能获得的最大利润是多少。
2. 输入输出
ⅰ.
Input:
prices = [1, 3, 2, 8, 4, 9], fee = 2
ⅱ.
Output:
8.
1.
我们考虑最朴素的方法,对于每一天,如果当前有股票,考虑出售或者保留,如果没股票,考虑购买或者跳过,进行dfs搜索。每天都有两种操作,时间复杂度为O(2^n)
2.
如何优化呢?我们用动态规划的思想来解决这个问题,考虑每一天同时维护两种状态:拥有股票(own)状态和已经售出股票(sell)状态。用own和sell分别保留这两种状态到目前为止所拥有的最大利润。 对于sell,用前一天own状态转移,比较卖出持有股是否能得到更多的利润,即sell = max(sell , own + price - fee), 而对于own , 我们考虑是否买新的股票更能赚钱(换言之,更优惠),own=max( own, sell-price)
3.
初始化我们要把sell设为0表示最初是sell状态且没有profit,把own设为负无穷因为最初不存在该状态,我们不希望从这个状态进行转移
4.
因为我们保存的都是最优状态,所以在买卖股票时候取max能保证最优性不变
5.
最后直接返回sell即可
http://www.jiuzhang.com/solution/best-time-to-buy-and-sell-stock-with-transaction-fee/
本题是一道中等偏简单难度的题目,需要用到动态规划的思想,利用以前的状态去更新当前状态,给出正确的O(n)解法可以达到hire要求
http://lintcode.com/en/problem/best-time-to-buy-and-sell-stock/
-
回复“简历”,查看简历撰写指南,获取“简历模板”
-
回复“冷冻期”,查看北美各大IT企业冷冻期信息和注意事项
-
回复“Career”, 查看Caireer Fair 攻略 check list
-
回复“薪资”,查看北美各大IT企业New Grades Engineer 薪资水平;
-
回复“项目”,查看7-14天可以搞定的小项目推荐
-
回复“评分”,查看系统设计评分指南
-
回复“behavior”,查看behavior interview指南
-
回复“晋升”,查看Engineer晋升机制
九章算法
| 帮助更多中国人找到好工作
春季课程免费试听