【发布时间】:2012-03-19 19:53:02
【问题描述】:
我在为一家初创公司面试时被问到这个问题,并在最近的比赛中再次看到这个问题
**问题:
给你一组天的股票价格。每天,您可以购买一个单位的股票,出售您已经购买的任意数量的股票单位,或者什么也不做。通过优化您的交易策略,您可以获得的最大利润是多少?**
示例(输入,即天数可能会有所不同)
5 3 2 => 利润 = 0 // 由于价格每天都在下降,我们可以赚取的最大利润 = 0
1 2 100 => 利润 = 197
1 3 1 2 =>profit = 3 // 我们以 1 买入,以 3 卖出,然后以 1 买入并以 2 卖出 ..总利润 = 3
我的解决方案:
a) 找出股票价格最高的那一天。直到那天继续购买 1 单位的股票。
b) 如果那一天是最后一天,则退出:
其他:
卖出当天的所有股票,并在当天之后拆分数组并递归剩余元素
c) 合并利润
例如 1 4 1 2 3
a) 第 2 天的最高股价 .. 所以我们在第 1 天买入股票并在第 2 天卖出(利润 = 3)然后我们在剩余的日子里递归:1 2 3
b) 最高价格为 3(第 5 天)所以我们继续在第 3 天和第 4 天买入股票并在第 5 天卖出(利润 = ( 3*2 - 3 = 3 )
c) 总利润 = 3 + 3 = 6
这个复杂度原来是 O(n^2) 。此解决方案通过了 11 个用例中的 10 个,但超过了最后一个测试用例(即最大输入)的时间限制
谁能想到一个更有效的解决方案来解决这个问题?有动态规划解决方案吗?
【问题讨论】:
-
我投票结束这个问题,因为它与编程无关。充其量只是一道数学题。
标签: algorithm recursion dynamic-programming