题目:给定一个数组,它表示了一只股票的价格浮动,第i个元素代表的是股票第i天的价格.设计一个函数,计算出该股票的最大收益,注意,可以多次买入卖出,但下一次买入必须是在本次持有股票卖出之后.比如[1,7,2,3,6,7,6,7],最大收益为9,第1天买入,第2天卖出,然后第3天买入,第6天卖出,第7天买入,第8天卖出.

  分析:该题目的难点在于可以多次买入和卖出.

  #1 找极值

  股票交易取得良好收益的方法是低价买入,高价卖出,并且由于该股票可以多次买入卖出,所以应该在极小值点买入,极大值点卖出.如下图所示的股票价格折线图,点1,点3,点7均为极小值点,点2,点6,点8均为极大值点,它们分别对应的就是买入和卖出的时间.因此,只要找到数组的极小值点和极大值点就可以解决该问题.在数学中,寻找极值的方法是求导,但此处只是一个有限长度且无规律的数组,按照极值的定义寻找即可,即邻域内的最大值和最小值,在数组值持续增大时,停止增大的点就是极大值,在数组值持续减小,停止减小的点就是极小值.代码如下.

  

class Solution:
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
i=0
earned=0
buy=0
while i<len(prices)-1:
while i<len(prices)-1 and prices[i+1]<=prices[i]:#极小值
i+=1
buy=i
while i<len(prices)-1 and prices[i+1]>=prices[i]:#极大值
i+=1
sell=i
earned+=(prices[sell]-prices[buy])
return earned

  代码注意两点:(1) 因为买入日期应当在卖出日期之前,因此先进行极小值的判断,再进行极大值的判断;(2)买入时间要初始化,因为可能会存在[1,2,3,4,5]这样的情况,这时程序无法找出极小值1.

  #2  极值进阶版

  其实题目并不要求输出买入和卖出的日期,只要求输出最后受益,所以其实我们并不需要找到极小值和极大值的点,只需要知道它们的差值,而b-a=(b-c)+(c-a),换句话说,可以通过极大值和极小值之间中间值,通过价格上涨的累加,算出最后的价格差值.比如上面的折线图,[1,7,2,3,6,7,6,7],当第3天买入后,第4天价格上涨1,第5天价格上涨3,第6天价格上涨1并停止上涨,股票卖出,那么从买入到卖出的收益为1+3+1=7-2=5.代码如下。

class Solution:
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
earned=0
if len(prices)<=1:
return earned
for i in range(len(prices)-1):
if prices[i+1]>prices[i]:
earned+=(price[i+1]-prices[i])
return earned

  #3 暴力求解

  暴力求解是最简单粗暴的方法,但关键仍然在于股票可以多次买入卖出,不能简单的将买入时间和卖出时间枚举一遍,代码如下。

class Solution:
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
def partProfit(start,prices):
if start==len(prices)-1:
return 0
maxprofit=0
for i in range(start,len(prices)-1):
maxi=0
for j in range(i+1,len(prices)):
if prices[j]>prices[i]:
profit=partProfit(j+1,prices)+prices[j]-prices[i]
if profit>maxi:
maxi=profit
if maxi>maxprofit:
maxprofit=maxi
return maxprofit
return partProfit*0,prices)

  python版本的暴力求解在leetcode上会超时。

 

  

  

leetcode122 买卖股票的最佳时机 python的更多相关文章

  1. [Swift]LeetCode122. 买卖股票的最佳时机 II | Best Time to Buy and Sell Stock II

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

  2. LeetCode122.买卖股票的最佳时机II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

  3. python买卖股票的最佳时机--贪心/蛮力算法简介

    开始刷leetcode算法题 今天做的是“买卖股票的最佳时机” 题目要求 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更 ...

  4. lintcode:买卖股票的最佳时机 II

    买卖股票的最佳时机 II 假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格.设计一个算法来找到最大的利润.你可以完成尽可能多的交易(多次买卖股票).然而,你不能同时参与多个交易(你必须在再 ...

  5. lintcode:买卖股票的最佳时机 I

    买卖股票的最佳时机 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. 样例 给出一个数组样例 [3,2,3 ...

  6. Leecode刷题之旅-C语言/python-121买卖股票的最佳时机

    /* * @lc app=leetcode.cn id=121 lang=c * * [121] 买卖股票的最佳时机 * * https://leetcode-cn.com/problems/best ...

  7. LeetCode《买卖股票的最佳时机》系列题目,最详解

    目录 说在前面 引例:只能交易一次 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 无限制买卖 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 交易 2 次,最大利润? 一.动态数 ...

  8. lintcode:买卖股票的最佳时机 IV

    买卖股票的最佳时机 IV 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格. 设计一个算法来找到最大的利润.你最多可以完成 k 笔交易. 注意事项 你不可以同时参与多笔交易(你必须在再次 ...

  9. lintcode:买卖股票的最佳时机 III

    买卖股票的最佳时机 III 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格.设计一个算法来找到最大的利润.你最多可以完成两笔交易. 样例 给出一个样例数组 [4,4,6,1,1,4,2 ...

随机推荐

  1. POJ2891:Strange Way to Express Integers(解一元线性同余方程组)

    写一下自己的理解,下面附上转载的:若a==b(modk);//这里的==指的是同余,我用=表示相等(a%k=b)a-b=kt(t为整数)以前理解的错误思想:以前认为上面的形式+(a-tb=k)也是成立 ...

  2. NodeJS学习笔记六

    Symbol简介 ES6引入了一种新的原始数据类型Symbol,表示独一无二的值.它是JavaScript语言的第七种数据类型,前六种是:Undefined.Null.布尔值(Boolean).字符串 ...

  3. 手把手教你学node.js之使用 superagent 与 cheerio 完成简单爬虫

    使用 superagent 与 cheerio 完成简单爬虫 目标 建立一个 lesson 3 项目,在其中编写代码. 当在浏览器中访问 http://localhost:3000/ 时,输出 CNo ...

  4. SQL面试题及答案

    我觉得里面有些答案是不正确的,请只作参考 Student(S#,Sname,Sage,Ssex) 学生表       S#:学号:Sname:学生姓名:Sage:学生年龄:Ssex:学生性别 Cour ...

  5. 2018-2019 Всероссийская командная олимпиада школьников по программированию, интернет-тур + отборы регионов (ВКОШП 18, интернет-тур) Solution

    A: 水. #include<bits/stdc++.h> using namespace std; typedef long long ll; const ll INFLL = 0x3f ...

  6. Entity Framework在WCF中序列化的问题(转)

    问题描述 如果你在WCF中用Entity Framework来获取数据并返回实体对象,那么对下面的错误一定不陌生. 接收对 http://localhost:5115/ReService.svc 的 ...

  7. Redis学习笔记之Linux下Redis的安装和部署

    0x00 Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统.和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相 ...

  8. 从知乎了解到,为什么Mysql禁用存储过程、外键和级联?

    打开帖子直接一张醒目的图,是阿里巴巴的Java开发手册对Mysql相关的要求. 看看下面的回复 灵剑 存储过程没有版本控制,版本迭代的时候要更新很麻烦.存储过程如果和外部程序结合起来用,更新的时候很难 ...

  9. BZOJ2221: [Jsoi2009]面试的考验

    传送门 一句话题意,给定一个序列,询问区间内差值的绝对值的最小值. 这道题之前见过一次,似乎是在一次UER上,那一道题当时是用了近似算法才能过. 数据保证数列随机. 这道题显然非常适合离线的做法,考虑 ...

  10. 《Effective Java 2nd》第8章 通用程序设计

    目录 第45条 将局部变量的作用域最小化 第46条 for-each循环优先于传统的for循环 第47条 了解和使用类库 第48条 如果需要精确的答案,避免使用float和double 第49条 基本 ...