动态规划之我不是股神(力扣C++题解)

写题解仅为自我回顾

理论内容:

代码随想录代码随想录PDF,代码随想录百度网盘,代码随想录知识星球,代码随想录八股文PDF,代码随想录刷题路线,代码随想录知识星球八股文https://www.programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4%BD%B3%E6%97%B6%E6%9C%BA.html


目录

1:买卖股票的最佳时机

 2:买卖股票的最佳时机II

3:买卖股票的最佳时机含手续费

4:买卖股票的最佳时机III(困难)

5:买卖股票的最佳时机IV(困难)

6:最佳买卖股票时机含冷冻期(最难)


1:买卖股票的最佳时机

 思路解析:

本题有三种方法,逐一介绍

1:暴力解法

遍历两次数组,两个for循环,用每次遍历让result=max(result,prices[j]-prices[i])来记录并更新

代码实现:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
    int result=0;
    for(int i=0;i<prices.size();i++)
    {
        for(int j=i+1;j<prices.size();j++)
        {
            result=max(result,prices[j]-prices[i]);
        }
    }
    return result;
    }
};

 

2:贪心算法

要使利润最大,那么就要保证我选择买的股票价格是最便宜的,我选择卖出的股票在那天是最贵的,并且买股票必须在卖股票之前;遍历一遍数组

用min取寻找最小的价格的股票:low=min(low,prices[i]);

用max取寻找最大的利润:result=max(result,prices[i]-low);

 代码实现:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
    int result=0;
    int low=INT_MAX;
    for(int i=0;i<prices.size();i++)
    {
        low=min(low,prices[i]);
        result=max(result,prices[i]-low);
    }
    return result;
    }
};

 

3:动态规划

(1)设想:假设刚开始没有钱,手头的钱为0,那么dp根据列坐标可根据题意分为两类

···1:dp[i][0]持有股票时的所得的最多钱

持有股票相当于:我可能是今天买的,也可能是前几天买的,此时我持有股票

递推公式:dp[i][0]=max(dp[i-1][0],-prices[i])

解释:此时我持有股票,我啥都不干,我的钱没有损失,等于上一个的结果;

此时我想要买下这个股票,那么我的现金就要从0变成-prices[i]:当日股票的价格负数

···2:dp[i][1]不持有股票时所得的最多钱

不持有股票相当于:我可能是今天卖的,也可能是前几天卖的,此时我没有股票

递推公式dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i])

解释:此时我不持有股票,我啥都不敢,我的钱没有损失,等于上一个的结果;

此时我想卖掉这个股票&#x

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值