博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode 【 Best Time to Buy and Sell Stock II 】python 实现
阅读量:5712 次
发布时间:2019-06-17

本文共 2254 字,大约阅读时间需要 7 分钟。

题目

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

 

代码:oj测试通过 Runtime: 71 ms

1 class Solution: 2     # @param prices, a list of integer 3     # @return an integer 4     def maxProfit(self, prices): 5         # none case or one element case 6         if prices is None or len(prices)<2 : 7             return 0 8         # dp 9         buy = 010         sell = 011         profit = 012         for i in range(len(prices)-1):13             if prices[i]<=prices[i+1]:14                 sell = i+115             else:16                 profit = profit + prices[sell]-prices[buy]17                 buy = i+118                 sell = i+119         return profit+max(0,prices[sell]-prices[buy])

 

思路

采用贪心算法。

代码的逻辑还算清晰:找到最长的上升区间,最低卖最高买即可;然后再找下一个上升区间;退出循环的时候注意处理一下最后一个上升或下降区间。

for循环:

1. if的部分就是不断找更大的上升空间,找到了就一定把sell放在更利润的卖点。

2. else的部分处理的是价格下降的情况,buy和sell需要同时跟进,这样保证同样的买卖价格,做到不赔钱

 

有一个梗:代码AC后,我review时发现if和else里面都有sell=i+1这个语句,那么既然不管是if或else都得执行sell=i+1,为啥还要在每个语句里面单拎出来呢?于是就有了下面的代码(这部分代码是错误举例用的):结果竟然是报错。

sell = i+1            if prices[i]>prices[i+1]:                profit = profit + prices[sell]-prices[buy]                buy = i+1

这是一个思维的陷阱:不错,确实在if和else里面都执行了sell=i+1这个语句,但是语句执行的逻辑顺序是不一样的。请注意,如果是prices[i]>prices[i+1]的条件下,sell=i+1是在profit语句之后执行的。于是恍然大悟,修改成如下的代码:

oj测试通过 Runtime: 67 ms

class Solution:    # @param prices, a list of integer    # @return an integer    def maxProfit(self, prices):        # none case or one element case        if prices is None or len(prices)<2 :            return 0        # dp        buy = 0        sell = 0        profit = 0        for i in range(len(prices)-1):            if prices[i]>prices[i+1]:                profit = profit + prices[sell]-prices[buy]                buy = i+1            sell = i+1        return profit+max(0,prices[sell]-prices[buy])

这样代码的逻辑就更简洁了,可以解释如下:只要相邻两天,后一天比前一天高就可以低买高卖产生利润。

第二个更简洁的代码,似乎也是网上更多的人列出来的答案。简洁的解法也可以由一般的解法推演出来。

 

转载于:https://www.cnblogs.com/xbf9xbf/p/4265257.html

你可能感兴趣的文章
[Asp.Net web api]基于自定义Filter的安全认证
查看>>
洛谷P3763 [TJOI2017]DNA(后缀自动机)
查看>>
确定当前记录和下一条记录之间相差的天数
查看>>
NYOJ32:组合数(DFS入门)
查看>>
使用Callable和Future接口创建线程
查看>>
BZOJ 2568 比特集合
查看>>
sql语句返回主键SCOPE_IDENTITY()
查看>>
MongoDB培训
查看>>
机器学习开源项目精选TOP30
查看>>
python基础===对字符串进行左右中对齐
查看>>
将博客搬至CSDN
查看>>
IO获取文件路径及扩展名等(提供Demo)
查看>>
常用推荐系统算法总结
查看>>
layout图形化界面看不到内容 Failed to find the style corresponding to the id
查看>>
Java实现微信小程序支付(准备)
查看>>
【Error】SSL InsecurePlatform error when using Requests package
查看>>
【Python】日期模块总结
查看>>
python解决列表,字典输出打印unicode转中文显示
查看>>
14-删除文件/目录 - rm,rmdir
查看>>
C#ComboBox控件“设置 DataSource 属性后无法修改项集合”的解决方法
查看>>