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中的继承和多态的概念
Apr 27 Python
django通过ajax发起请求返回JSON格式数据的方法
Jun 04 Python
Django中模版的子目录与include标签的使用方法
Jul 16 Python
人工神经网络算法知识点总结
Jun 11 Python
在python中将list分段并保存为array类型的方法
Jul 15 Python
python实现最大优先队列
Aug 29 Python
python Django框架实现web端分页呈现数据
Oct 31 Python
使用Python实现正态分布、正态分布采样
Nov 20 Python
python 实现按对象传值
Dec 26 Python
详解Ubuntu环境下部署Django+uwsgi+nginx总结
Apr 02 Python
python字符串的index和find的区别详解
Jun 20 Python
python 实现围棋游戏(纯tkinter gui)
Nov 13 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
PHP读取文件并可支持远程文件的代码分享
2012/10/03 PHP
php获取汉字首字母的函数
2013/11/07 PHP
javascript window.opener的用法分析
2010/04/07 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
JQuery中serialize()用法实例分析
2015/02/06 Javascript
网页收藏夹显示ICO图标(代码少)
2015/08/04 Javascript
让图片跳跃起来  javascript图片轮播特效
2016/02/16 Javascript
关于JS中match() 和 exec() 返回值和属性的测试
2016/03/21 Javascript
老生常谈JavaScript数组的用法
2016/06/10 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
JavaScript调试的多个必备小Tips
2017/01/15 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
Vue.js表单标签中的单选按钮、复选按钮和下拉列表的取值问题
2017/11/22 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
Vue 实现创建全局组件,并且使用Vue.use() 载入方式
2020/08/11 Javascript
python利用正则表达式提取字符串
2016/12/08 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
python爬虫爬取某站上海租房图片
2018/02/04 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
2018/12/26 Python
Django使用redis缓存服务器的实现代码示例
2019/04/28 Python
Django框架模板的使用方法示例
2019/05/25 Python
Pytorch GPU显存充足却显示out of memory的解决方式
2020/01/13 Python
DRF框架API版本管理实现方法解析
2020/08/21 Python
表单button的outline在firefox浏览器下的问题
2012/12/24 HTML / CSS
俄罗斯外国汽车和国产汽车配件网上商店:Движком
2020/04/19 全球购物
理工类毕业自我鉴定
2014/02/20 职场文书
保护环境倡议书100字
2014/05/19 职场文书
购房意向书
2014/08/30 职场文书
乡镇干部个人整改措施思想汇报
2014/10/10 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
住房公积金贷款工资证明
2015/06/12 职场文书
用Python实现屏幕截图详解
2022/01/22 Python
APP界面设计技巧和注意事项
2022/04/29 杂记