python买卖股票的最佳时机(基于贪心/蛮力算法)


Posted in Python onJuly 05, 2019

开始刷leetcode算法题 今天做的是“买卖股票的最佳时机”

题目要求

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

看到这个题目 最初的想法是蛮力法

通过两层循环 不断计算不同天之间的利润及利润和

下面上代码

class Solution(object):
  def maxProfit(self, prices):
    """
    :type prices: List[int]
    :rtype: int
    """

    self.allbuy1 = []  #单次买卖的差值数组 (可能为负)
    self.allbuy2 = []  #所有可能买卖的利润数组 (可能为负)
               # allbuy1和allbuy2的区别为一个是单次买卖 一个是多次买卖和
    self.curbuy(prices,0,0) #prices 为价格表 0:初始 0:
    #print(self.allbuy1)
    #print(self.allbuy2)
    return self.picBigest(self.allbuy2)
  def buyticket(self,prilist,a,b):    #list:放入的价格数组 a:上一次买入的价格 b:今天卖出的价格
    return prilist[b] -prilist[a]  #返回 赚取得价格

  def curbuy(self,plist,x,result): #plist:价格数组 x:当天的数组坐标 result: 利润
    obj=result           #固定上一次的价格 保存为上一个递归
    lens=len(plist)        #天数
    for i in range(x,lens-1):
      for j in range(i+1,lens):
        temp=self.buyticket(plist,i, j)
        self.allbuy1.append(temp)
        self.allbuy2.append(temp)   #单次利润放入数组
        result = obj + temp   #将之前的利润加上今天的利润
        if(x>=2):       #如果买入是第2+1天以后 则可以加上之前的利润
          self.allbuy2.append(result) #多次买卖利润放入数组
        self.curbuy(plist,j+1,result)  #递归 j+1:卖出的后一天 result:利润

  def picBigest(self,reslist): 
    big=0
    for i in reslist:
      if (i>big):
        big=i
    print(big)
    return big

if __name__ == '__main__':
    test=Solution()
    prices = [5,7,3,8] # 输入的每日股票数组
    test.maxProfit(prices)

分析:

这个代码理解起来简单 就是将所有可能都放入数组中 找出最大一个可能

将这个代码提交时 显示 超出时间限制 确实 如果输入的数组长度非常大时 计算量巨大 出现错误

——————————————————————————————————————————————————————————————————————————————

更换思路:利用贪心算法解决此事

首先介绍 一下贪心算法: 对问题只对当前情况进行最优解处理,之后发生什么对之前的决定都不改变。简单的说就是一个局部最优解的过程

介绍个例子就明白了: 找零钱问题

假设有面值为5元、2元、1元、5角、2角、1角的货币,需要找给顾客4元6角现金,为使付出的货币的数量最少

  • 首先找出小于4元6角的最大面值(2元)

  • 其次找出小于2元6角的最大面值(2元)

  • 接着找出小于6角的最大面值(5角)

  • 最后找出小于1角的最大面值(1角) ---付出4张纸币

介绍完了贪心算法简单思想 就利用该方法解决对应问题

在已知股票价格走势情况下 只需要对下一天进行判断 如果涨了 则买 如果跌了则卖 这样收益会保持固定增长

当然了 有人会提出 我可以选择不卖等几天再卖 或不买等几天再买 的方式 一样可以保持增长 但是如图

python买卖股票的最佳时机(基于贪心/蛮力算法)

如果在第2天买入 3天卖出 4天买入 5天卖出 收益为A+B

如果在第2天买入 5天卖出 收益为 C

明显得出A+B大于C 所以贪心法在这种情况非常适用并且肯定得到最优解

直接上代码

class Solution(object):
  def maxProfit(self, prices):
    profit = 0
    for day in range(len(prices)-1):
      differ = prices[day+1] - prices[day]
      if differ > 0:
        profit += differ
    return profit
if __name__ == '__main__':
    test=Solution()
    prices = [5,7,3,9] # 输入的每日股票数组
    print(test.maxProfit(prices))

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 用户登录验证的小例子
Mar 06 Python
怎样使用Python脚本日志功能
Aug 14 Python
Python线程指南详细介绍
Jan 05 Python
Python标准库sched模块使用指南
Jul 06 Python
Python Json序列化与反序列化的示例
Jan 31 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
May 10 Python
Python中如何导入类示例详解
Apr 17 Python
Python读取VOC中的xml目标框实例
Mar 10 Python
拿来就用!Python批量合并PDF的示例代码
Aug 10 Python
python 19个值得学习的编程技巧
Aug 15 Python
Django URL参数Template反向解析
Nov 24 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
Python 计算任意两向量之间的夹角方法
Jul 05 #Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 #Python
Python3+Appium实现多台移动设备操作的方法
Jul 05 #Python
Python PIL读取的图像发生自动旋转的实现方法
Jul 05 #Python
python读出当前时间精度到秒的代码
Jul 05 #Python
python读写csv文件方法详细总结
Jul 05 #Python
Python考拉兹猜想输出序列代码实践
Jul 05 #Python
You might like
smarty模板引擎之分配数据类型
2015/03/30 PHP
laravel model模型定义实现开启自动管理时间created_at,updated_at
2019/10/17 PHP
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
Javascript倒计时页面跳转实例小结
2013/09/11 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
JavaScript让Textarea支持tab按键的方法
2015/06/26 Javascript
JavaScript判断表单为空及获取焦点的方法
2016/02/12 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
webpack vue 项目打包生成的文件,资源文件报404问题的修复方法(总结篇)
2018/01/09 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
vue3 watch和watchEffect的使用以及有哪些区别
2021/01/26 Vue.js
Javascript实现关闭广告效果
2021/01/29 Javascript
Python兔子毒药问题实例分析
2015/03/05 Python
使用基于Python的Tornado框架的HTTP客户端的教程
2015/04/24 Python
python修改字典内key对应值的方法
2015/07/11 Python
Python实现的下载网页源码功能示例
2017/06/13 Python
浅谈django model postgres的json字段编码问题
2018/01/05 Python
Python如何抓取天猫商品详细信息及交易记录
2018/02/23 Python
Python3字符串encode与decode的讲解
2019/04/02 Python
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
比利时买床:Beter Bed
2017/12/06 全球购物
澳大利亚领先的在线药房:Pharmacy Online(有中文站)
2020/02/22 全球购物
轻化专业学生实习自我鉴定
2013/09/20 职场文书
电信专业应届生自荐信
2013/09/28 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
中学校庆方案
2014/03/17 职场文书
党员干部公开承诺书
2014/03/26 职场文书
商场主管竞聘书
2014/03/31 职场文书
报名委托书
2015/01/29 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
Apache Linkis 中间件架构及快速安装步骤
2022/03/16 Servers
详解MongoDB排序时内存大小限制与创建索引的注意事项
2022/05/06 MongoDB
Java获取字符串编码格式实现思路
2022/09/23 Java/Android