题目链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

示例 1:

输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:

输入: [1,2,3,4,5]
输出: 4
解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。
     注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。
     因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

1 <= prices.length <= 3 * 10 ^ 4
0 <= prices[i] <= 10 ^ 4

解题报告:

比较相邻两天,如果价格跌了,则处理掉手中的股票,并买入当天的股票(这一步是为了统一所有情况,方便写代码),反之则不卖股票。

AC代码:(贪心)

class Solution {
public:int maxProfit(vector<int>& prices) {int keep_price = prices[0];int ans = 0;for(int i = 1; i<prices.size(); i++) {if(prices[i] < prices[i-1]) {ans += prices[i-1] - keep_price;keep_price = prices[i];}}ans += prices[prices.size()-1]-keep_price;return ans;}
};

解题报告2:

直接dp。

考虑到「不能同时参与多笔交易」,因此每天交易结束后只可能存在手里有一支股票或者没有股票的状态。

定义状态dp[i][0] 表示第 i 天交易完后手里没有股票的最大利润,dp[i][1] 表示第 i 天交易完后手里持有一支股票的最大利润(i从 0 开始)。

注意因为定义的不是赚的钱,而是交易结束后,手里还有多少钱(可以是负数那种)。所以不需要管上次从哪开始买(不然需要再来一层循环了),直接用上一天的随时更新着点当前手里的钱就行了。

AC代码:(dp)

class Solution {
public:int dp[30005][2];int maxProfit(vector<int>& prices) {dp[0][0] = 0;dp[0][1] = -prices[0];for(int i = 1; i<prices.size(); i++) {dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i]);dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]);}return dp[prices.size() - 1][0];}
};

错误代码:

class Solution {
public:int dp[30005][2];int maxProfit(vector<int>& prices) {dp[0][0] = 0;dp[0][1] = -prices[0];for(int i = 1; i<prices.size(); i++) {dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i-1]);dp[i][1] = max(dp[i-1][1], dp[i-1][0] - prices[i]);}return dp[prices.size() - 1][0];}
};class Solution {
public:int dp[30005][2];int maxProfit(vector<int>& prices) {dp[0][0] = 0;dp[0][1] = -prices[0];for(int i = 1; i<prices.size(); i++) {dp[i][0] = max(dp[i-1][0], dp[i-1][1] + prices[i-1]);dp[i][1] = max(dp[i-1][1]-prices[i-1]+prices[i], dp[i-1][0] - prices[i]);}return dp[prices.size() - 1][0];}
};

【LeetCode - 122】买卖股票的最佳时机 II(贪心 或 dp)相关推荐

  1. 159. Leetcode 122. 买卖股票的最佳时机 II (贪心算法-股票题目)

    class Solution:def maxProfit(self, prices: List[int]) -> int:result = 0for i in range(1,len(price ...

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

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

  3. leetcode 122. 买卖股票的最佳时机 II(贪心算法)

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

  4. leetcode 122. 买卖股票的最佳时机 II 思考分析

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

  5. Leetcode 122.买卖股票的最佳时机II

    Time: 20190904 Type: Easy 考察:动态规划 题目描述 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完 ...

  6. Leetcode 122.买卖股票的最佳时机 II (每日一题 20210618)

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

  7. leetcode 122 买卖股票的最佳时机II

    贪心算法:如果今天买明天能够盈利,那就今天买入明天卖出:对于这个问题来讲是具有最优子结构性质的 分情况: 1)当len<1:不会赚钱,return 0: 2) class Solution { ...

  8. leetcode 122. 买卖股票的最佳时机 II

    难度:中等 频次:35 题目: 给定一个数组 prices ,其中 prices[i] 表示股票第 i 天的价格. 在每一天,你可能会决定购买和/或出售股票.你在任何时候 最多 只能持有 一股 股票. ...

  9. Leetcode 122. 买卖股票的最佳时机 II 解题思路及C++实现

    解题思路: 采用贪心策略,只要后一天的价格高于前一天,就将差价加进来.得到的结果就是能获取的最大利润. class Solution { public:int maxProfit(vector< ...

  10. 106. Leetcode 122. 买卖股票的最佳时机 II (动态规划-股票交易)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i]是一个长度为len(prices)的一维数组,表示的是在第i天持有股票 步骤二.推断状态方程: 第i天持有股票,即dp[i][1], 那么两个状态 ...

最新文章

  1. RestSharp .net 轻量级rest客户端
  2. 服务器上有图片但是app不显示不出来,网络app图片显示不出来的
  3. LocalReport Print with C# C#打印RDLC
  4. 随机加解密java_JAVA随机数生成 Math.random和java.util.Random使用简介
  5. 1.c++中初始化列表和构造函数初始化的区别是什么?2.类的成员变量的初始化顺序是按照声明顺序吗?
  6. 给商品评分效果,CSS技巧
  7. IDE之VS:Visual Studio的简介(包括 VS2013、VS2015、VS2017、VS2019)、安装、入门、使用方法之详细攻略
  8. 【转】虚拟机文件格式详解 .VMX .VMSD .VMDK .NVRAM .VMX
  9. Linux中使用宝塔面板部署tipask3.*超详细教程,吐血两天部署成功,把过程整理出来,送给被官方文档折磨的小白们~~~~
  10. 20230411笔记-MTK天玑开发者日(北京站)
  11. 自动化做任务、收能量工具Hamibot,我愿称它为神器
  12. 客户端与服务器端交互原理(HTTP数据请求与HTTP响应)
  13. 设置高德地图在Fragment中显示
  14. 有什么软件可以编译汇编程序?
  15. 使用BlueZ连接蓝牙手柄
  16. google 浏览器打印不出颜色问题
  17. java编程入门到精通看什么书,详细说明
  18. show sga 的描述
  19. 宿舍住宿管理java课程设计_宿舍管理系统Java课程设计
  20. MATLAB 单双引号

热门文章

  1. 微软企业库4.1学习笔记(十)企业库的设计
  2. [Leedcode][JAVA][第55题][跳跃游戏][贪心][动态规划]
  3. 概率中比较重要的知识
  4. java phantomjs alert_Python+Selenium+PhantomJS脚本中的Javascript警报
  5. 华为云服务器安装win10系统,云服务器可以安装win10吗
  6. pb mysql 中文乱码_解决springmvc+mybatis+mysql中文乱码问题
  7. jsp中设置自动换行_办公技巧—Word中如何设置自动生成序号
  8. python字符串字面量有哪四种定义方式_Python学习笔记(四)字符串型
  9. Python中曲率与弯曲的转换_黎曼几何学习笔记(3)——共形数量曲率与高斯曲率...
  10. spring webflow getting start