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 as many transactions as you like (ie, buy one and sell one share of the stock multiple times). However, you may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).
此题的意思是可以买卖多次,获得最大利润。实则是一个贪心问题,如果该天的股票价格在后一天涨了,那么就买,第二天卖掉。依次后推。可能有人会提问,为什么如果第二天降价 不买当天的呢,如果买了的话,等以后几天涨价再卖掉就好了啊,还能获得利润的?
如果这样的话,为什么不直接买第二天降价后的呢?这样会获得更大的利润,对吧?
所以只要第二天涨价 那么就买当天的,这样便能获得最大利润。
class Solution {
public int maxProfit(int[] prices) {
int sum = 0;
for (int i = 0; i < prices.length-1; i++) {
if (prices[i] < prices[i + 1]) sum += prices[i+1] - prices[i];
}
return sum;
}
}
最后提问一个问题,就是如果要获得最大利润,那么所需要的最多的交易数是多少呢?
需要最多的交易数是 n/2向下取整。比如这种情况达到最大的交易数,1,2,3,4 需要两天。如果交易数>[n/2] 那么说明必定在某一天即买又卖。如果是先买后卖的话,那肯定是没有必要的,因为利润增加是0。如果是先卖后买的话,说明在后面的价格还会再涨,那么根本就不需要卖。所以,还是不必要的交易,所以最大的交易数是n/2向下取整。(没有严格的证明,只是简单地分析了一下)。