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日

相关文章

  • 浅谈Android Studio如何Debug对应so文件C/C++代码

    针对“浅谈Android Studio如何Debug对应so文件C/C++代码”的问题,我准备了以下的攻略,供您参考: 1. 前置条件 在开始进行操作前,有一些前置条件需要满足: 您已经安装了Android Studio,并成功配置好了NDK。 您已经成功编译出了需要Debug的C/C++代码,并生成了对应的SO文件。 如果您还没有完成上述前置条件,请先完成…

    C 2023年5月23日
    00
  • Win10预览版19042升级后浏览器网页异常内容显示不全怎么办?

    对于Win10预览版19042升级后浏览器网页异常内容显示不全的情况,可能是因为升级过程中出现了一些问题导致系统出现了一些错误,或者是因为浏览器插件以及设置的问题所导致的。以下是处理该问题的完整攻略。 步骤一:更新浏览器插件 第一步需要检查浏览器是否有最新版本的插件可用,如果有,则需要更新插件以解决可能出现的兼容性问题。比如,用户在使用谷歌浏览器时,可以按照…

    C 2023年5月23日
    00
  • C语言中分支和循环的6种实现形式总结

    C语言中分支和循环的6种实现形式总结如下。 1. if语句 if语句是C语言中最基本的分支语句,用于根据条件的真假来选择性地执行不同的语句。 if (condition) { // if语句执行的代码块 } 示例代码: #include <stdio.h> int main() { int num; printf("请输入一个整数:&q…

    C 2023年5月23日
    00
  • C语言实现猜数字游戏的两种方法

    让我来详细讲解一下如何通过C语言实现猜数字游戏的两种方法。 1. 第一种方法:使用随机数 1.1 实现思路 使用随机数实现猜数字游戏的流程如下: 程序随机生成一个数字; 用户输入一个数进行猜测; 程序根据用户猜测的数,判断是大、小还是等于随机数; 如果猜对了,输出提示信息并结束程序;如果猜错了,输出提示信息并继续猜。 1.2 代码示例 下面是使用随机数实现猜…

    C 2023年5月23日
    00
  • C语言结构体大小分析

    title: C语言结构体大小分析 author: saopigqwq233 date: 2022-04-05 C语言结构体大小分析 一,基本类型 C语言自带的数据类型大小如下 数据类型 大小(字节) char 1 short 2 int 4 long 4或8 float 4 double 8 long double 16 二,自定义类型—struct …

    C语言 2023年4月17日
    00
  • C++ Boost Conversion超详细讲解

    C++ Boost Conversion超详细讲解 什么是Conversion? 在C++编程中,Conversion代表着把一个对象转换成另一种对象的操作。Conversion由C++ Core Language v1.05中的12.3章节定义。例如,如果我们需要把一个整数转换成另一个整数类型或者浮点数类型,那么就需要进行Conversion操作。 Boo…

    C 2023年5月23日
    00
  • 使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小(最新推荐)

    这里提供一个使用C++和Direct3D (d3d)获取屏幕截图并根据传入分辨率进行缩放图片大小的攻略,具体步骤如下: 步骤1:初始化Direct3D 使用Direct3D获取屏幕截图需要初始化Direct3D,示例代码如下: // 引入Direct3D #include <d3d9.h> #pragma comment(lib, "d…

    C 2023年5月23日
    00
  • Java日常练习题,每天进步一点点(13)

    下面开始对“Java日常练习题,每天进步一点点(13)”进行详细讲解。 标题 题目的标题为:“Java日常练习题,每天进步一点点(13)”,包含了练习题的主题和编写者的打算。因此该标题可以作为一篇文章的标题,并且能够清晰地传达文章的主旨。 题目描述 题目是一个练习题,其中包含了三个问题: 1.编写一个 Java 程序,实现将一个二维数组进行旋转的功能。 2.…

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