LeetCode188—Best Time to Buy and Sell Stock IV

本文介绍了一种算法,用于确定股票交易的最佳时机以实现最大利润,允许进行最多k次交易,并探讨了不同情况下的时间复杂度优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题

原题链接

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most k transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

分析

参考: LeetCode123—Best Time to Buy and Sell Stock III
将2次买卖扩展到k次。
时间复杂度 O(kn) 空间复杂度可以 O(n) 也可以 O(n2)

提交一直TLE,后来在discuss看到一种情况,也就是考虑当交易次数超过数组长度的一半时,可以用贪心来做,这样就可以降低时间复杂度了。参考:https://discuss.leetcode.com/topic/12250/share-my-c-dp-solution-with-o-kn-time-o-k-space-10ms/12

class Solution {
    public:
    int maxProfit(int k, vector<int>& prices) {
        if(prices.size()<=1)
            return 0;
        //vector< vector<int> > local(prices.size()+1,vector<int>(k+1));
        //vector< vector<int> > global(prices.size()+1,vector<int>(k+1));

        if (k>prices.size()/2){ // simple case
            int ans = 0;
            for (int i=1; i<prices.size(); ++i){
                ans += max(prices[i] - prices[i-1],0);
            }
            return ans;
        }

        vector<int> local(k+1);
        vector<int> global(k+1);
        for(int i=0;i<prices.size()-1;++i)
        {
            int diff = prices[i+1]-prices[i];
            for(int j=k-1;j>=0;--j)
            {
                local[j+1] = max(local[j+1]+diff, global[j]+max(0,diff) );
                global[j+1]= max(global[j+1],local[j+1]);
            }
        }
        return global[k];
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值