LeetCode动态规划+贪心 买卖股票的最佳时机II

You are given an array prices where prices[i] is the price of a given stock on the ith day.
Find the maximum profit you can achieve. You may complete as many transactions as you like (i.e., buy one and sell one share of the stock multiple times).
Note: You may not engage in multiple transactions simultaneously (i.e., you must sell the stock before you buy again).

思路
本题假如规定只能进行一次买卖的话,那就是典型的动态规划问题了,具体作法详见买卖股票的最佳时机I
但是本题允许多次购买,那就不难想到可以采用贪心的方法。当前价格小于后一个价格,又满足卖出不会亏损时,就可以将其卖掉。
需要注意的是,卖出股票后,dp数组应更新为当前的股票价格。
考虑到边界问题,需要将prices数组添加一个末尾0,使得遍历最后一个股票价格时,i+1不会超出容器边界。

状态转移方程
dp[i] = min(dp[i-1], prices[i])

边界条件
dp[0] = prices[0]

代码

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int dp[30005] = {0};
        dp[0] = prices[0];
        int sum = 0;
        
        prices.push_back(0);
        int len = prices.size();
        for(int i = 1; i < len-1; i++)
        {
            dp[i] = min(dp[i-1], prices[i]);
            if(prices[i] > prices[i+1] && prices[i] > dp[i-1])
            {
                sum += prices[i] - dp[i-1];
                dp[i] = prices[i];
            }
        }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值