Leetcode 贪心 Best Time to Buy and Sell Stock III

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


Best Time to Buy and Sell Stock III

  Total Accepted: 8447  Total Submissions: 38417

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 two transactions.

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




题意:给定一组数,表示某个股票每天的价格,问怎么买卖可获得最大利益。最多可以买卖再次
思路:分段动规
因为最多可买卖两次,所以可分将数组两段,每段取最大利益
设i将[1,n]分为[1,i]和[i,n](如果第一段在i卖,第二段在i买,则两段合为一段)
f[i]表示以i为结尾的最大利益
f[i] = max(f[i - 1], prices[i] - cur_min_price), cur_min_price表示当前最小价格
从0到n,求f[i]
g[i]表示以i为开头的最大利益
g[i] = max(g[i + 1], cur_max_price - prices[i]), cur_max_price表示当前最大价格
从n到n,求g[i]
因为最多可以买卖两次,即可以少于两次,所以允许在一天内既买又卖,即不交易。
这点体现在在求f[i],g[i]的时候,先求cur_min_price,cur_max_price,再求f[i],g[i],
最后的结果为
max{f(i) + g(i)}
复杂度:O(n)

class Solution {
public:
    int maxProfit(vector<int> &prices){
    	int n = prices.size();
    	if(n < 2) return 0;
    
    	vector<int> f(n, 0);
    	vector<int> g(n, 0);
    
    	for(int i = 1, cur_min_price = prices[0]; i < n; i++){
    		cur_min_price = min(cur_min_price, prices[i]);
    		f[i] = max(f[i - 1], prices[i] - cur_min_price);
    	}
    
    	for(int j = n - 2, cur_max_price = prices[n - 1]; j > -1; j--){
    		cur_max_price = max(cur_max_price, prices[j]);
    		g[j] = max(g[j + 1], cur_max_price - prices[j]);
    	}
    
    	int max_profit = 0;
    	for(int i = 0; i < n; i++){
    		max_profit = max(max_profit, f[i] + g[i]);
    	}
    
    	return max_profit;
    }


};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值