力扣121. 买卖股票的最佳时机(动态规划)

力扣121. 买卖股票的最佳时机(动态规划)

动态规划:

有点像0-1背包问题:

买入:

 i当天买入i当天不买入
i当天买入的最大收益-i当天的股价i-1买入的最大收益,维持现状
in[i]-prices[i]in[i-1]

卖出:

 i当天卖出i当天不卖出
i当天卖出的最大收益i-1天买入的最大收益+i当天的股价i-1天卖出的最大收益,维持原状
out[i]out[i-1]+prices[i]out[i-1]

i-1天买入的最大收益,这里很多人不理解,以为仅仅是前一天的价格,其实i-1天买入的最大收益已经取最大值,即i-1天买入的最大收益代表第一天到第i-1天的最佳买入点,只是没有标记哪一天,直接相加即可。

复杂度分析:

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)
//
//  main.cpp
//  121maxProfit
//
//  Created by MXQ on 2020/10/21.
//

#include <iostream>
#include<vector>
using namespace::std;
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n=prices.size();
        if(n==0 || n==1)return 0;
        vector<int>in(n);
        vector<int>out(n);
        out[0]=0;
        in[0]=-prices[0];
        int maxoutvalue=0;
        for (int i=1; i<n; i++) {
            //转移方程
            in[i]=max(-prices[i],in[i-1]);
            out[i]=max(in[i-1]+prices[i],out[i-1]);
            if (out[i]>maxoutvalue) {
                maxoutvalue=out[i];
            }
        }
        return maxoutvalue;
    }
};
int main(int argc, const char * argv[]) {
    // insert code here...
    vector<int>prices={7,6,4,3,1};
    Solution s;
    auto result=s.maxProfit(prices);
    std::cout << result<<endl;
    std::cout << "Hello, World!\n";
    return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值