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

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日

相关文章

  • PostgreSQL 实现将多行合并转为列

    下面是详细讲解”PostgreSQL 实现将多行合并转为列”的完整攻略。 背景 假设当前有如下一张表格table1,其中id列为主键,col_name列为需要转为列的字段名称,col_value列为需要转为列字段对应的值。 id col_name col_value 1 name John 1 age 30 1 gender Male 2 name Emil…

    C 2023年5月22日
    00
  • Visual C++ 6.0无法正常启动提示0xc0000142怎么办?vc6.0无法执行程序解决方法

    Visual C++ 6.0无法正常启动提示0xc0000142怎么办? 当你在使用 Visual C++ 6.0 运行程序时,可能会遇到“无法正常启动,错误代码为 0xc0000142”的提示信息。出现这个问题的原因多种多样,可能是操作系统或 Visual C++ 本身的问题。下面我们来一步步解决这个问题。 步骤一:升级 Visual C++ 6.0 首先…

    C 2023年5月23日
    00
  • C++ 基础教程之虚函数实例代码详解

    下面是针对“C++ 基础教程之虚函数实例代码详解”的完整攻略: C++ 基础教程之虚函数实例代码详解 什么是虚函数? 在 C++ 中,虚函数是指在基类中声明为虚的函数,其在派生类中被重新定义的函数。使用虚函数可以实现运行时多态性,即在程序运行时根据对象的类型确定调用的方法。 在基类中使用虚函数时,需要将函数声明为“virtual”,并且函数的定义可以为纯虚函…

    C 2023年5月24日
    00
  • 浅析C语言中sscanf 的用法

    浅析C语言中sscanf的用法 简介 sscanf是C语言标准库中的函数,其作用是根据指定格式从一个字符串中读取数据并赋值给指定的变量。sscanf函数常用于解析文本中的数据,可以接受类似于printf函数的格式字符串,并将字符串中的数据进行解析。 语法 int sscanf(const char *str, const char *format, …)…

    C 2023年5月23日
    00
  • C语言中的自定义类型之结构体与枚举和联合详解

    C语言中的自定义类型之结构体与枚举和联合详解 什么是自定义类型 C语言中的自定义类型是开发人员按照自己的需求所定义的类型。通过自定义数据类型,可以使数据类型的使用更为规范,提高程序的可读性和可维护性。 C语言中常见的自定义类型包括结构体、枚举和联合。 结构体 结构体是一种用户自定义的数据类型,它允许我们将不同类型的变量组合在一起,形成一个新的数据类型。结构体…

    C 2023年5月23日
    00
  • C++抽奖程序实现方法

    下面是 C++ 抽奖程序的实现方法完整攻略,包括以下步骤: 1. 设计程序功能 在开始编写代码之前,我们需要先明确程序需要实现的功能,即实现一个简单的抽奖程序,需要包括以下特点: 参与抽奖的人员名单事先固定,即不允许现场填写名字等信息; 程序需要在全部人员名单中随机抽取若干名中奖者; 抽奖过程需要进行多次,每次抽奖结果不重复; 可以在控制台中显示每次抽奖的结…

    C 2023年5月23日
    00
  • 小米4c怎么样?小米4c搭载骁龙808和Type-C

    当谈到小米4c时,我们需要关注它的配置和性能。小米4c主打设计良好且价格亲民的特点,它的主要优势在于骁龙808处理器和Type-C接口。 小米4c搭载骁龙808处理器 小米4c搭载了骁龙808处理器,它是高通推出的一款六核心处理器,其中两个大核心时钟频率高达1.8GHz,剩下的四个小核心时钟频率为1.4GHz。 骁龙808处理器采用了Adreno 418 G…

    C 2023年5月23日
    00
  • C语言实现2D赛车游戏的示例代码

    下面我将详细讲解如何实现一个简单的2D赛车游戏。 1. 实现思路 首先,我们需要了解游戏的基本组成部分: 游戏场景 赛车模型 道路模型 背景音乐 操作控制 根据以上组成部分,我们可以总体将实现思路分为以下几个步骤: 创建画布:使用某种绘图库创建基础画布,用于绘制游戏场景。 绘制游戏场景:在基础画布上绘制游戏所需的场景元素,包括道路和赛车模型。 添加背景音乐:…

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