首页 > 代码库 > Best Time to Buy and Sell Stock III
Best Time to Buy and Sell Stock III
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).
思路:最佳时间买入卖出股票,但是这题与前两题有所不同而且比较难,最多进行两次买卖,但是同一时间手上只能保持一个股票。使用动态规划思想,是比较好的思路(PS:也是借鉴网上大神思路).先正序扫描0~i天的最大利润,在倒序扫描i+1~n天的最大利润,放在两个数组中,然后求出第i项最大和。
1.min1=prices[0];
2.定义profit1数组,保存正序扫描的利润:profit1[i]=profit1[i]-min(prices[i],min1)当profit1[i]-min(prices[i],min1)>profit1[i-1];反之则为profit1[i]=proft1[i-1];
3.max1=prices[n-1]
4.定义profit2数组,保存逆序扫描的最大利润:profit2[i]=max(prices[i],max1)-prices[i],当max(prices[i],max1)-prices[i]>profit2[i+1];反之,profit2[i]=profit2[i+1];
5.最后把第i项最大和求出,返回最大利润。
class Solution { public: int maxProfit(vector<int> &prices) { int n=prices.size(); if(n<=0) return 0; vector<int> profit1(n,0); vector<int> profit2(n,0); int min=prices[0]; for(int i=1;i<n-1;i++) { if(prices[i]<min) min=prices[i]; if(prices[i]-min>profit1[i-1]) profit1[i]=prices[i]-min; else profit1[i]=profit1[i-1]; } int max=prices[n-1]; for(int i=n-2;i>=0;i--) { if(prices[i]>max) max=prices[i]; if(max-prices[i]>profit2[i+1]) profit2[i]=max-prices[i]; else profit2[i]=profit2[i+1]; } int maxprofits=0; for(int i=0;i<n-1;i++) { if(profit1[i]+profit2[i]>maxprofits) maxprofits=profit1[i]+profit2[i]; } return maxprofits; } };