首页 > 其他分享 >代码随想录day50 | 123.买卖股票的最佳时机III 188. 买卖股票的最佳时机 IV

代码随想录day50 | 123.买卖股票的最佳时机III 188. 买卖股票的最佳时机 IV

时间:2022-11-09 19:23:41浏览次数:62  
标签:vector 买卖 int 复杂度 随想录 最佳时机 prices dp

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

题目|文章
image

思路

相比于122.买卖股票的最佳时机III,这道题多了一道限制,就是买卖次数的限制,我的想法是通过增加一维来实现。文章中给出的方法则更加简单,将各种状态全部列出来,用二维数组就可以实现。

  1. 数组以及下标含义
    dp[i][j]:
    j=0:到第i天交易次数为0次时的利润。
    j = 1: 买入一次
    j = 2: 买卖一次
    j = 3: 买入两次
    j = 4: 买卖两次
    当j = 4时的利润最大,可以理解为每笔操作都至少赚钱,如果不能赚钱,就空买卖一次。
  2. 递推关系
    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i])
  • 如果不进行操作,那么跟前一天的情况相同,为dp[i - 1][j]
  • 如果进行操作,那么相当于在前一天的上一种情况进行操作。例如:如果要完成买入第二次(j = 3)的操作,那么就要在前一天买卖一次(j = 2)的情况下进行操作
  1. 初始化
    当手中没有股票时,需要买入股票,那么当j = 1和 j = 3的情况下,需要初始化为 -prices[i]
  2. 遍历顺序
    按照天数,从前向后进行遍历

实现

点击查看代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        vector<vector<int>> dp(prices.size(), vector<int>(2, 0));
        dp[0][0] = -prices[0];
        dp[0][1] = 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][1];
    }
};

复杂度分析

  • 时间复杂度:O(n),n为prices的大小,即所有的天数。
  • 空间复杂度:O(n)

188. 买卖股票的最佳时机 IV

题目|文章
image

思路

这道题与上一题的思路是一致的,只是增加了状态数量而已,使用循环对状态进行操作即可。

实现

点击查看代码
class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        int m = 2*k + 1;
        vector<vector<int>> dp(prices.size(), vector<int>(m, 0));
        for(int i = 0; i < m; i++) {
            if(i % 2 == 1) {
                dp[0][i] = -prices[0];
            }
        }
        for(int i = 1; i < prices.size(); i++) {
            dp[i][0] = 0;
            for(int j = 1; j < m; j++) {
                if(j % 2 == 1) {
                    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);
                }
                else {
                    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i]);
                }
            }
        }
        return dp[prices.size() - 1][m - 1];
    }
};

复杂度分析

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

标签:vector,买卖,int,复杂度,随想录,最佳时机,prices,dp
From: https://www.cnblogs.com/suodi/p/16874872.html

相关文章

  • 代码随想录day48 | 198.打家劫舍 213.打家劫舍II 337.打家劫舍III
    198.打家劫舍题目|文章思路数组以及下标含义dp[j]:当偷到第j家时所能获得的最多的金钱递推公式dp[j]=max(dp[j-1],dp[j-2]+nums[i])当偷到第j家时,如果偷......
  • #yyds干货盘点# 动态规划专题:买卖股票的最好时机(二)
    1.简述:描述假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益1.你可以多次买卖该只股票,但是再次购买前......
  • 代码随想录day45 | 70. 爬楼梯 322. 零钱兑换 279. 完全平方数
    70.爬楼梯题目|文章思路这道题目要求有序,因此是全背包的排列做法。1.数组下标以及含义dp[i]:爬到n台阶一共有dp[i]种方法。2.递推关系dp[i]+=dp[i-j];3.初始......
  • 代码随想录Day20
    LeetCode104.找出二叉树最大深度给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示......
  • 代码随想录day44 | 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ
    完全背包文章思路有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i]。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物......
  • 代码随想录day43 | 1049. 最后一块石头的重量 II 494. 目标和 474. 一和零
    1049.最后一块石头的重量II题目|文章思路求剩余石头的最小重量。如果两个石头最接近总重量的平均值,那么剩余石头为最小重量。所以先求出石头的总重量的一半。1.数......
  • 代码随想录Day19
    LeetCode101对称二叉树  思路:判断二叉树是否是对称二叉树,我首先想到的是层序遍历,然后取每层的值进行判断是否是回文。但是这种做法是错误的,不能只在意值上面的回文,......
  • 代码随想录Day18
    LeetCode226 翻转二叉树  思路:遍历节点,交换左右孩子的顺序即可。前序遍历(中左右)、后序遍历(左右中)都可以,中序遍历这样写就行不通,会做多余的翻转操作。遍历的写法:1......
  • 代码随想录训练营第二十五天 | 回溯算法
    今天是第二十五天,回溯算法216.组合总和IIIclassSolution{List<List<Integer>>res=newArrayList<>();List<Integer>paths=newArrayList<>();......
  • 代码随想录Day17
    LeetCode199.二叉树右视图给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。   层序遍历一个思路,只需要判断当前元素是否......