买卖股票的最佳时机

121. 买卖股票的最佳时机,easy
思路:
一次遍历,对于第 j 天,只要是在第 j 天之前股票价格最低的那天买进,就是对于 j 这一天可获得利润的最大值,所以在遍历中维护股票价格最低的那一天的信息就可以一次遍历得到最大值

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int minv=prices[0];//最低股票价格
        int result=0;//可获得的最大利润
        for(int i=0;i<prices.size();++i){
            result=max(result,prices[i]-minv);//判断最大利润
            minv=min(prices[i],minv);//维护最低价格
        }
        return result;
    }
};

122. 买卖股票的最佳时机 II .easy
思路:根据题目,可以多次买卖股票,同时可以在今天把手头上的股票卖出的同时今天又买入,所以,只要在遍历时,prices[ i ] > prices[ i - 1 ] ,就可以获得利润。

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

309. 最佳买卖股票时机含冷冻期medium
对于每一天结束后的状态(也就是下一天开始时的状态)有三种:

  1. dp[0]:持有股票不在冷冻期
  2. dp[1]:不持有股票在冷冻期
  3. dp[2]:不持有股票不在冷冻期

每天的起始状态不同可以选的操作就不同
假设今天起始的状态为tmp[3]
那么对于今天结束后的状态

  1. dp[ 0 ] 可能是之前就持有了,也可能是今天才买的(也就是起始状态为tmp[ 2 ])
  2. 。。。
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int dp[3]={-prices[0],0,0};//dp[0]:持有股票不在冷冻期;
        //dp[1]:不持有股票在冷冻期;dp[2]:不持有股票不在冷冻期
        int tmp[3]={0,0,0};
        for(int i=1;i<prices.size();++i){
            tmp[0]=dp[0];
            tmp[1]=dp[1];
            tmp[2]=dp[2];
            dp[0]=max(tmp[2]-prices[i],tmp[0]);
            dp[1]=tmp[0]+prices[i];
            dp[2]=max(tmp[1],tmp[2]);
        }
        return max(dp[1],dp[2]);
    }
};

714. 买卖股票的最佳时机含手续费 medium
延续上一题的思路

class Solution {
public:
    int maxProfit(vector<int>& prices, int fee) {
        int dp[2]={-prices[0],0};//这一天结束后的状态:
        //dp[0]:手里有股票;dp[1]:手里没有股票
        int tmp[2]={0,0};
        for(int i=1;i<prices.size();++i){
            tmp[0]=dp[0];
            tmp[1]=dp[1];//存储这一天开始时的状态,也就是上一天结束时的状态
            dp[0]=max(tmp[0],tmp[1]-prices[i]);//不可能有今天卖了再买,这样只会赔掉手续费
            dp[1]=max(tmp[0]+prices[i]-fee,tmp[1]);
        }
        return dp[1];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值