leetcode122 买卖股票的最佳时机 python
题目:给定一个数组,它表示了一只股票的价格浮动,第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的更多相关文章
- [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 ...
- LeetCode122.买卖股票的最佳时机II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...
- python买卖股票的最佳时机--贪心/蛮力算法简介
开始刷leetcode算法题 今天做的是“买卖股票的最佳时机” 题目要求 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更 ...
- lintcode:买卖股票的最佳时机 II
买卖股票的最佳时机 II 假设有一个数组,它的第i个元素是一个给定的股票在第i天的价格.设计一个算法来找到最大的利润.你可以完成尽可能多的交易(多次买卖股票).然而,你不能同时参与多个交易(你必须在再 ...
- lintcode:买卖股票的最佳时机 I
买卖股票的最佳时机 假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格.如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润. 样例 给出一个数组样例 [3,2,3 ...
- Leecode刷题之旅-C语言/python-121买卖股票的最佳时机
/* * @lc app=leetcode.cn id=121 lang=c * * [121] 买卖股票的最佳时机 * * https://leetcode-cn.com/problems/best ...
- LeetCode《买卖股票的最佳时机》系列题目,最详解
目录 说在前面 引例:只能交易一次 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 无限制买卖 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 交易 2 次,最大利润? 一.动态数 ...
- lintcode:买卖股票的最佳时机 IV
买卖股票的最佳时机 IV 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格. 设计一个算法来找到最大的利润.你最多可以完成 k 笔交易. 注意事项 你不可以同时参与多笔交易(你必须在再次 ...
- lintcode:买卖股票的最佳时机 III
买卖股票的最佳时机 III 假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格.设计一个算法来找到最大的利润.你最多可以完成两笔交易. 样例 给出一个样例数组 [4,4,6,1,1,4,2 ...
随机推荐
- Spark SQL与Hive on Spark的比较
简要介绍了SparkSQL与Hive on Spark的区别与联系 一.关于Spark 简介 在Hadoop的整个生态系统中,Spark和MapReduce在同一个层级,即主要解决分布式计算框架的问题 ...
- 2.7 The Object Model -- Bindings, Observers, Computed Properties:What do I use when?
有时候新用户在使用计算属性.绑定和监视者时感到困惑.下面是一些指导方针: 1. 使用computed properties来合成其他属性,以构建新的属性.computed properties不应该包 ...
- Wannafly挑战赛28 Solution
A:msc和mas Solved. 考虑斐波那契数列,即最多加45次即会超过1e9,直接暴力即可 #include <bits/stdc++.h> using namespace std; ...
- Lyft Level 5 Challenge 2018 - Elimination Round
A. King Escape 签. #include <bits/stdc++.h> using namespace std; ], y[]; int f1(int X, int Y) { ...
- uva1424
Traveling salesmen of nhn. (the prestigious Korean internet company) report their current location t ...
- Vue学习笔记之计算属性和侦听器
0x00 计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split(''). ...
- A*寻路算法详细解读
文章目录 A*算法描述 简化搜索区域 概述算法步骤 进一步解释 具体寻路过程 模拟需要更新F值的情况 Lua代码实现 在学习A*算法之前,很好奇的是A*为什么叫做A*.在知乎上找到一个回答,大致意思是 ...
- 漏洞利用之Metasploit使用过程
漏洞利用之Metasploit使用过程 先扫描端口,看开放的服务,如开放ftp,版本是vsftpd 2.3.4:使用search搜索vsftp查看是否在相应的漏洞利用exploit,输入search ...
- git将多个commit合并成一个新的commit
问题: 有以下commit: 323udd ede234 6e7s6e 要合并第一个和第二个commit 方法有二: 方法一 使用git rebase -i hash-id,-i表示以交互模式进行co ...
- SDN原理 控制层 Controller控制器
本文参照SDN原理视频而成:SDN原理 Controller 概念 从上面这个图片,我们能够知道,Controller 是一个非常重要的东西:承上启下,左右拓展. 从整个SDN的架构来看,控制器 处在 ...