代码随想录刷题第48天

今天来看看股票市场。第一题是买卖股票的最佳时机https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/,首先想到了暴力解法,两层for循环,时间复杂度为n * n,代码超时了。

复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int a = 0;
    for(int i = 0; i < prices.size(); i++){
        for (int j = i + 1; j < prices.size(); j++){
            if (prices[j] > prices[i])
            a = max(a, prices[j] - prices[i]);

        }
    }
    return a;
    }
};

看了卡哥思路,发现是用动态规划解决,上动规五步曲:对于遍历到的每一天,只有持有股票和不持有股票两种状态,即dpi0与dpi1。其中dpi0表示持有股票的最大利润,dpi1表示不持有股票获得的最大利润。若第i天持有股票,则也有两种情况:第i天前已持有股票,dpi0 = dpi - 10;第i天时买入股票,dpi0 = - pricesi,dpi0在两者中取最大值即可。若第i天未持有股票,对应情况相似:第i天前已经不在持有股票了,dpi1 = dpi - 11;第i天时卖出股票,dpi1 = pricesi + dpi - 10,dpi1取两者之间的最大值。根据题意与递推公式可知,dp00 = -prices0,dp01 = 0。从前向后遍历dp数组,得出代码。

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

第二题是买卖股票的最佳时机IIhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/,该题中股票可以被多次买出卖出,对于上一题中的dpi0而言,当是第i天买入股票时,dpi0 = dpi - 11 - pricesi。其余代码均无需改动。

复制代码
class Solution {
public:
    int maxProfit(vector<int>& prices) {
    if (prices.size() == 0) return 0;
    vector<vector<int>> dp(prices.size(), vector<int>(2));
    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 max(dp[prices.size() - 1][0], dp[prices.size() - 1][1]);
    }
};
相关推荐
Gigavision39 分钟前
基于BUAA-MIHR数据集的噪声解耦对比学习算法
人工智能·python·深度学习·算法
鹿角片ljp1 小时前
LeetCode 64:最小路径和复盘|二维 DP 与 ACM 模式完整写法
java·数据结构·算法
彧azz2 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
Beyond_System|系统之外3 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
汉克老师4 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood4 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz5 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
圣保罗的大教堂5 小时前
leetcode 835. 图像重叠 中等
leetcode
朽棘不雕5 小时前
进一步了解模板
c++
叠层归一研究院6 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi