虽然把这道题归为简单,但还是有点绕。解题思路和第1567道有点类似。
package likou;
/*
* 买卖股票的最佳时机
* 题干:
* 给定一个数组prices,其中prices[i]是一支给定股票第i天的价格
* 设计一个算法来计算你所能获取的最大利润
* 你可以尽可能地完成更多的交易(多次买卖一支股票)
* 要求:必须在再次购买前出售掉之前的股票
*/
public class Demo122 {
/*
* 该题和力扣1567有点类似,但1567要更复杂一些
* 解题思路:
* 定义 0=<i<prices.length
* 计算第i天的收益时需要根据第i天结束时,手上是否有股票两种情况来判断
* 假设第i天结束时手上有股票,则可能存在两种场景,一种是第i-1天就有股票,一种是第i天才买的股票
* 假设第i天结束时手上没有股票,则可能存在两种场景,一种是第i-1天就没有股票,一种是第i天卖出股票
* 定义两个参数dp0,dp1分别表示第i天没有股票和有股票的场景,priceDifference为最大收益
*/
public int maxProfit(int[] prices) {
int dp0 = 0;
int dp1 = -prices[0];
int length = prices.length;
for(int i=1;i<length;i++) {
int temp_dpo = Math.max(prices[i]+dp1, dp0);//手上没有股票的收益
int temp_dp1 = Math.max(dp0-prices[i], dp1);//手上有股票的收益
dp0 = temp_dpo;
dp1 = temp_dp1;
}
return dp0;
}
public static void main(String args[]) {
Demo122 demo = new Demo122();
int[] prices = {7,1,5,3,6,4};
System.out.println(demo.maxProfit(prices));
}
}