1.一开始以为动态规划,直接按照动归的思路来做了,buy[i]表示第i天买入时获得最大利润,
Sell[i]表示第i天卖出其最大利润,有公式,buy[i]=max{sell[1]..sell[i-1]}-a[i]; sell[i]=max{buy[1]..buy[i-1]}+a[i]
public class Solution {
public int maxProfit(int[] prices) {
int l=prices.length+1;
int[] buy=new int[l];
int[] sell=new int[l];
sell[0]=0;
buy[0]=Integer.MIN_VALUE;
int maxsell=sell[0];
int maxbuy=buy[0];
for(int i=1;i<=prices.length;i++){
sell[i]=maxbuy+prices[i-1];
if (sell[i]>maxsell) maxsell=sell[i];
buy[i]=maxsell-prices[i-1];
if (buy[i]>maxbuy) maxbuy=buy[i];
}
return maxsell;
}
}
2.后来想了想似乎没那么麻烦,直接贪心就可以了,找到一个连续递减序列的最小的,然后再找到一个连续递增最大的,相减就是这段可以获得最大利润。
public int maxProfit(int[] prices) {
int profit = 0, i = 0;
while (i < prices.length) {
while (i < prices.length-1 && prices[i+1] <= prices[i]) i++;
int min = prices[i++];
// find next local maximum
while (i < prices.length-1 && prices[i+1] >= prices[i]) i++;
profit += i < prices.length ? prices[i++] - min : 0;
}
return profit;
}
3.看了下mostvotes,发现了这个更简洁的做法,有人说这种方法是假定了可以同一天买和卖,其实不对,比如三天的价格是1,2,5,最多能挣5-1,等于(2-1)+(5-2)其实是一种等效,并不是一定在同一天买了又卖。
public class Solution {
public int maxProfit(int[] prices) {
int total = 0;
for (int i=0; i< prices.length-1; i++) {
if (prices[i+1]>prices[i]) total += prices[i+1]-prices[i];
}
return total;
}