[LeetCode 123] Best Time to Buy and Sell Stock III

题意

    有一个数组price,price[ i ] 是第 i 天的股票价格。你的手上最多持有一支股票,且最多进行两次交易,求最大利润。


思路

    求出从第一天到第 i 天之内,买卖一次获得的最大收益,再求出从第 i+1 天到最后一天之内,买卖一次获得的最大收益。然后 i 从 0 到 n-1 扫一遍就行了。时间复杂度是O(n)。

    可能是坑的地方:你可以不买股票,因此利润的最小值是0。如果数组为空,直接返回0,不然会RE。


python代码
class Solution:
    def maxProfit(self, prices):
        """
        :type prices: List[int]
        :rtype: int
        """
        n = len(prices)
        if n == 0:
            return 0
        '''分别记录前面若干天之内和后面若干天之内,一次买卖的最大收益'''
        left = [0] * n
        right = [0] * n
        minp = prices[0]
        maxp = prices[n-1]
        
        for i in range(1,n,1):
            '''minp表示从第0天到第i天的最低价格'''
            minp = min(minp, prices[i])
            left[i] = max(left[i-1], prices[i]-minp)
        for i in range(n-2,-1,-1):
            '''maxp表示从最后一天到第i天的最低价格'''
            maxp = max(maxp, prices[i])
            right[i] = max(right[i+1], maxp-prices[i])
        
        '''left[n-1]表示最多进行一次买卖获得的最大收益'''
        ans = left[n-1]
        for i in range(0,n-1):
            ans = max(ans, left[i]+right[i+1])
            
        return ans


C++代码
#include<algorithm>
#include<vector>
using namespace std;

class Solution
{
public:
    int maxProfit(vector<int> &prices)
    {
        if(prices.empty() || prices.size() == 1)
            return 0;
        
        int ans=0;
        int n=prices.size();
        vector<int> left(n+10,0);
        vector<int> right(n+10,0);
        
        int minp=prices[0];
        left[0]=0;
        for(int i=1;i<n;i++)
        {
            minp=min(minp,prices[i]);
            left[i]=max(left[i-1],prices[i]-minp);
        }
        int maxp=prices[n-1];
        right[n-1]=0;
        for(int i=n-2;i>=0;i--)
        {
            maxp=max(maxp,prices[i]);
            right[i]=max(right[i+1],maxp-prices[i]);
        }
        
        ans=max(left[n-1],right[0]);
        for(int i=0;i<n-1;i++)
            ans=max(ans,left[i]+right[i+1]);
        
        return ans;
    }
};

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值