题目描述:假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。

样例:给出一个样例数组 [4,4,6,1,1,4,2,5], 返回 6

之前,关于“买卖股票”的故事,我们已经讲过两集:买卖股票的最佳时机,买卖股票的最佳时机 II。

我默认你看这篇文章的时候,已经对前面两道题的方法彻底明白了。前面的第一道题关键是只能进行一次交易,第二道题的关键是可以进行任意次交易,而现在的问题是要进行两次交易,且只能进行两次交易。只能一次交易的时候,是根据数组特性,使用贪心法,任意次交易时,就更简单了,只要股票涨价,就交易,求总和即可。但是现在这种只能交易两次的情况,无疑,比前面的两道题都难。

可以这样来思考:既然我们已知进行一次交易的最大值了,那么,想要两次交易获得最大值,就存在以下可能的三种情况:在此之前,为了方便描述,我假设完成一次利润最大交易的开始时间为left,结束时间为right

1. 在left之前,进行一次交易,使得利润最大,这个最大利润加上left-right之间的利润,就是最终最大利润

2. 在right之后,进行一次交易,使得利润最大,这个最大利润加上left-right之间的利润,就是最终最大利润

3. 在left-right之间去掉最大损失,这样把left-right分成两段,这两段的利润和就是最大利润

换句话说,我们需要做的是求出上面3中情况的值,求他们的最大值。而left-right之间的最大损失的计算方法与最大利润的计算方法是极为相似的,不再赘述。

代码如下:

class Solution:"""@param prices: Given an integer array@return: Maximum profit"""def maxProfit(self, prices):result1 = self.profit(prices)left, right = result1[0], result1[1]r1 = self.profit(prices[:left])[-1] + result1[-1]r2 = self.profit(prices[right + 1:])[-1] + result1[-1]r3 = result1[-1] - self.loss(prices[left + 1: right])return max(r1, r2, r3)def profit(self, prices):n = len(prices)if n < 2:return [0, 0, 0]sum_val, max_val = 0, 0left, right = 0, 1# 将可能成为left的值存储为temptemp = leftfor i in range(n - 1):sum_val += prices[i + 1] - prices[i]# 获得更大利润了,更新left, right以及max_valif sum_val > max_val:right = i + 1left = tempmax_val = sum_valsum_val = max(0, sum_val)# 说明上一步中,sum_val <= 0,需更新tempif sum_val == 0:temp = i + 1# 返回左右值及最大利润return [left, right, max_val]def loss(self, prices):n = len(prices)if n < 2:return 0sum_val, min_val = 0, 0for i in range(n - 1):sum_val += prices[i + 1] - prices[i]min_val = min(min_val, sum_val)sum_val = min(0, sum_val)return min_val

lintcode - 买卖股票的最佳时机 III相关推荐

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

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

  2. 123. 买卖股票的最佳时机 III ( 三维dp )

    LeetCode:123. 买卖股票的最佳时机 III 之前的含手续费定义了两个状态(持股与不持股), 含冷冻期定义了三个状态(持股, 不持股冷冻期, 不持股非冷冻期), 都是二维数组. 本题除了持股 ...

  3. 算法训练第五十天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

    动态规划part11 123.买卖股票的最佳时机III 题目描述 思路 拓展 188.买卖股票的最佳时机IV 题目描述 思路 易错点 123.买卖股票的最佳时机III 题目链接:123.买卖股票的最佳 ...

  4. 【第50天| ● 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV 】

    123.买卖股票的最佳时机III class Solution {public:int maxProfit(vector<int>& prices) {vector<int& ...

  5. 算法训练Day50 | LeetCode123. 买卖股票的最佳时机III(最多买卖2次);LeetCode188. 买卖股票的最佳时机IV(最多买卖K次)

    目录 LeetCode123. 买卖股票的最佳时机III 1. 思路 2. 代码实现 3. 复杂度分析 4. 思考与收获 LeetCode188. 买卖股票的最佳时机IV 1. 思路 2. 代码实现 ...

  6. 力扣 -- 123. 买卖股票的最佳时机 III

    题目链接:123. 买卖股票的最佳时机 III - 力扣(LeetCode) 下面是用动态规划的思想解决这道题的过程,相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴. 参考代码: class So ...

  7. 第43天| 123.买卖股票的最佳时机III、 188.买卖股票的最佳时机IV

    1.题目链接:123. 买卖股票的最佳时机 III 题目描述: 给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你最多可以完成 两笔 交易 ...

  8. 买卖股票的最佳时机III

    思路 这道题目相对 121.买卖股票的最佳时机 和 122.买卖股票的最佳时机II 难了不少. 关键在于至多买卖两次,这意味着可以买卖一次,可以买卖两次,也可以不买卖. 确定dp数组以及下标的含义 一 ...

  9. LeetCode 123. 买卖股票的最佳时机 III(动态规划)

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

最新文章

  1. git 提交跳过检查
  2. Python3 命名规范
  3. ARP探测目标工具arping常用命令集合大学霸IT达人
  4. kaggle房价预测特征意思_R语言实战:复杂数据处理和分析之Kaggle房价预测
  5. 大数据之“用户行为分析”
  6. php写接口的注意事项,接口的调用注意事项
  7. c++计算eigen随笔(3)-求逆
  8. 获取目录的大小函数linux,Linux C++获取文件夹大小1(通过lstat实现)
  9. 数据结构与算法专题——第九题 鸡尾酒排序
  10. 解析ip数据包java_ip包,ip数据包,数据包或者包的理解
  11. java第七章jdbc课后简答题_Java进阶之JDBC面试题(7)
  12. jquery 获取指定元素
  13. 零基础学C/C++40——鸡兔同笼
  14. 上计算机课睡觉检讨书400,课堂睡觉200字检讨书
  15. 电脑感叹号,电脑网络出现感叹号怎么解决?Win7系统网络出现感叹号的解决方法...
  16. 2022电赛省一-小车跟随行驶系统(C题)
  17. 一个字等于几个字节,怎么确定机器是16/32/64位机器
  18. 论 致命错误c0000005
  19. ERP发展趋势(转)
  20. 怒怼软件测测试不良培训机构!痛斥招转培!

热门文章

  1. 王者服务器维护8.25,上单位移全部削弱射手春天到来!王者荣耀体验服8.25英雄调整详解...
  2. Codeforces Round #788 (Div. 2)题解
  3. 如何保障域名在微信的正常访问 避免推广的域名链接在微信被拦截
  4. 洛谷1373(dp)
  5. 写代码时遇到的脚本内容
  6. hog 行人检测 matlab,hog+svm_行人检测matlab程序
  7. 离散数学 逻辑判断系统 代码_基于线性时态逻辑的物联网操作系统安全性设计...
  8. 2022.12.14-----leetcode.1697
  9. 皮带跑偏识别检测 YOLO深度学习
  10. python批量修改word表格实例尝试(python-docx模块)