面试算法题02--最优解法

假定你是交易员,必须在股票开盘时作出买入或卖出的决定。设计一个算法,根据给定的股价走势信息,决定买入和卖出策略,该策略必须实现利润的最大化。

在算法题01中,我们提到了暴力枚举法求解问题,其代码量小,便于理解。但是经过计算我们发现算法的复杂度为 O ( n 2 ) O(n^2) O(n2)。(https://blog.csdn.net/WINNER_QIUQIU/article/details/105663322)

通过阅读Python程序员面试宝典一书,书中提到了最优解法,具体代码如下:

minPrice = S[0]    
N = 0    
profit = 0    
selDay = 0    
buyDay = 0    
for N in range(len(S)-1):        
    if(S[N]<minPrice):            
        minPrice = S[N]            
        buyDay = N                
    if(S[N+1]-minPrice > profit):            
        profit = S[N+1] - minPrice            
        selDay = N+1    
print("应该在{}天买入,第{}天卖出,最大交易利润为:{}".format(buyDay+1,selDay+1,profit))

通过代码可以容易看出此算法的复杂度为 O ( n ) O(n) O(n),相比于暴力枚举法整整降低了一个数量级。

最后需要注意的是,此算法存在卖出时间会在买入时间之前的问题,希望有大佬留言评论提出解决问题的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值