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之使用Python操作数据库(1)
Nov 25 Python
深入学习Python中的上下文管理器与else块
Aug 27 Python
Python基于identicon库创建类似Github上用的头像功能
Sep 25 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
Nov 24 Python
python学习入门细节知识点
Mar 29 Python
Python 实现使用dict 创建二维数据、DataFrame
Apr 13 Python
python3.4.3下逐行读入txt文本并去重的方法
Apr 29 Python
用python实现将数组元素按从小到大的顺序排列方法
Jul 02 Python
python 读取文件并把矩阵转成numpy的两种方法
Feb 12 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
windows python3安装Jupyter Notebooks教程
Apr 13 Python
python UDF 实现对csv批量md5加密操作
Jan 01 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
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
2015/03/03 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
jQuery获得IE版本不准确webbrowser的解决方法
2014/02/23 Javascript
jQuery动画效果animate和scrollTop结合使用实例
2014/04/02 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
jquery实现聚光灯效果的方法
2015/02/06 Javascript
详解JavaScript基本类型和引用类型
2015/12/09 Javascript
JavaScript递归操作实例浅析
2016/10/31 Javascript
ES6概念 Symbol toString()方法
2016/12/25 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
详解Vue-Cli 异步加载数据的一些注意点
2017/08/12 Javascript
微信小程序使用checkbox显示多项选择框功能【附源码下载】
2017/12/11 Javascript
浅谈Vue 数据响应式原理
2018/05/07 Javascript
Vue 莹石摄像头直播视频实例代码
2018/08/31 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
Vue.js计算机属性computed和methods方法详解
2019/10/12 Javascript
vue遍历对象中的数组取值示例
2019/11/07 Javascript
vue视频播放暂停代码
2019/11/08 Javascript
jQuery实现轮播图效果demo
2020/01/11 jQuery
JS代码检查工具ESLint介绍与使用方法
2020/02/04 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
详解vue中使用transition和animation的实例代码
2020/12/12 Vue.js
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
Python实现七个基本算法的实例代码
2020/10/08 Python
移动端Html5页面生成图片解决方案
2018/08/07 HTML / CSS
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
师范毕业生自我鉴定
2014/01/15 职场文书
初中班级口号
2014/06/09 职场文书
建设办主任四风问题整改思路和措施
2014/09/20 职场文书
社区活动总结
2015/02/04 职场文书