C++实现LeetCode(188.买卖股票的最佳时间之四)

yizhihongxing

C++实现LeetCode(188.买卖股票的最佳时间之四)攻略

题目描述

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你最多可以完成 k 笔交易。

注意:

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

示例1:

输入:k = 2, prices = [2,4,1]
输出:2
解释:在第 1 天 (股票价格 = 2) 的时候买入,在第 2 天 (股票价格 = 4) 的时候卖出,这笔交易所能获得利润 = 4-2 = 2 。

示例2:

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

思路分析

本题可以使用动态规划的思想来解决。

  • 定义dp数组:利用一个三维数组dp[i][j][0/1]表示第i天,已经完成j笔交易,手中没有股票/手中有股票的最大利润。
  • 状态转移方程:一个交易包括“购买股票”和“售出股票”两次操作,因此需要分别考虑这两种情况。在当前第i天,购买一支股票的最大利润等于前一天已经卖出一支股票,和前一天没有卖出股票且已经继续交易的最大利润中取最大值。售出股票的最大利润同理。
  • 边界条件:当k > n/2时,问题退化为贪心算法,可转化为无限次交易具体请见LeetCode题解。

C++代码示例

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

示例说明

以示例2为例,当k = 2时,可以将该问题转化为“12345”5天内最多交易2次股票问题:

  • 购买一支股票的最大利润可以通过比较“1”0和“1”1中的最大值得到;售出股票的最大利润可以通过比较“1”1和“2”0中的最大值得到。
  • 购买一支股票的最大利润可以通过比较“1”2和“1”3中的最大值得到;售出股票的最大利润可以通过比较“1”3和“2”1中的最大值得到。
  • 购买一支股票的最大利润可以通过比较“4”0(0表示目前没有手中股票)和“4”1中的最大值得到;售出股票的最大利润可以通过比较“4”1和“5”0中的最大值得到。
  • 购买一支股票的最大利润可以通过比较“4”2和“4”3中的最大值得到;售出股票的最大利润可以通过比较“4”3和“5”1中的最大值得到。
  • 最后将“5”0股票不持有的最大利润返回即可。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现LeetCode(188.买卖股票的最佳时间之四) - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • vscode配置C/C++运行环境的步骤(超级详细)

    下面我将为您详细讲解如何在VS Code中配置C/C++运行环境。 步骤一:安装 Visual Studio Code 首先,您需要安装 Visual Studio Code,可以从官网 https://code.visualstudio.com/ 下载对应的安装包进行安装。 步骤二:安装 C/C++ 扩展 在 Visual Studio Code 中,您需…

    C 2023年5月23日
    00
  • 浅谈PowerShell 捕获错误

    关于 PowerShell 捕获错误的攻略,我们可以分为以下几个方面进行介绍: 异常处理 在 PowerShell 中,可以使用 try-catch 块对异常进行处理,具体语法如下: try { # 执行可能会有异常的代码 } catch { # 处理异常信息 } 其中,try 块中的代码就是可能会出现异常的代码块。如果有异常发生了,就会进入 catch 块…

    C 2023年5月22日
    00
  • 如何使用C++获取指定的重载函数地址

    下面是如何使用C++获取指定的重载函数地址的完整攻略: 1. 使用函数名作为参数获取函数地址 在C++中,对于重载函数,不同重载版本的函数名称可能相同,但是它们的参数类型和参数个数不同。因此,如果我们要获取某个指定重载版本的函数地址,需要使用重载函数的完整名称,包括参数类型和参数个数。例如: void foo(int x); void foo(double …

    C 2023年5月23日
    00
  • win10系统左下角搜索栏点击Win+C无反应的解决方法

    当我们在Win10系统中使用搜索栏,偶尔会遇到点击Win+C无反应的问题。这可能是由于系统故障、Win10更新问题或安装软件不当等原因引起的。以下是解决这个问题的完整攻略,可以帮助您解决这个问题。 问题分析 当搜索栏出现在左下角时,在Windows 10操作系统上单击Win+C组合键时,应该会打开Cortana语音助手,但是有时候无论怎么按,都没有反应。这种…

    C 2023年5月23日
    00
  • C++实现闹钟程序的方法

    下面我来详细讲解一下 C++ 实现闹钟程序的方法。 一、实现思路 要实现闹钟程序,就需要先了解一下闹钟程序的基本功能:1)设置闹钟时间;2)定时器到时后发出提示音;3)停止提示音。根据这些功能,我们可以分解出以下几个步骤: 读取用户设置的闹钟时间; 判断当前时间是否等于闹钟时间,如果不等待,则继续等待; 定时器到时后,播放提示音; 用户选择关闭提示音或延迟提…

    C 2023年5月23日
    00
  • 荣耀畅玩7c怎么截长屏?荣耀畅玩7c滚动截屏教程

    荣耀畅玩7c怎么截长屏? 在荣耀畅玩7c中,想要截取整个长页面时,需要使用滚动截屏的功能。下面是具体的操作步骤: 打开你需要截屏的页面,滚动到页面最顶部; 按下电源键和音量减键同时按住,直到屏幕闪一下; 这时候就已经完成了第一张截屏,继续向下滚动,直到滑动到要截屏的最下面的部分; 继续按下电源键和音量减键同时按住,直到屏幕闪一下,即可完成整个页面的截屏。 需…

    C 2023年5月23日
    00
  • C语言链表实现学生成绩管理系统

    C语言链表实现学生成绩管理系统 简介 链表是一种重要的数据结构,在C语言中经常用来实现动态存储和管理数据。在学生成绩管理系统中,链表也可以被用来储存和管理多名学生的成绩信息。这篇攻略将会详细讲解C语言链表实现学生成绩管理系统的过程,并提供两个示例用以帮助读者更好地了解如何使用链表。 实现过程 1. 定义学生结构体 首先,在C语言中实现链表需要定义一个结构体,…

    C 2023年5月23日
    00
  • C语言模拟实现密码输入的示例代码

    下面是关于“C语言模拟实现密码输入的示例代码”的完整攻略。 一、问题描述及解决思路 在C语言中,实现密码输入的方式一般是通过scanf或gets函数来实现。但这两种方式都有一个共同的问题,就是在输入密码时,密码会被明文显示在屏幕上,存在安全隐患。因此,为了提高系统的安全性,可以使用一些特殊的函数来模拟实现密码输入功能。 在C语言中,实现密码输入可以借助于Wi…

    C 2023年5月24日
    00
合作推广
合作推广
分享本页
返回顶部