思路:本題的意圖還是非常好理解的,就是要求一個數(shù)組中,后減去前的最大正數(shù)差值,很自然我們可以想到用雙重for循環(huán)進行遍歷加上計數(shù)器記錄最大差值,時間復雜度為n的平方,很自然就超時了
// 暴力超時
int result = 0;
for (int i = 0; i < prices.length; i++) {
for (int j = i+1; j < prices.length; j++) {
result = Math.max(result,prices[j] - prices[i]);
}
}
return result;
所以再次回到了用動態(tài)規(guī)劃解決的思路,首先先確定dp數(shù)組的意義,本題數(shù)組的索引代表了天數(shù),而每天也會有兩種狀態(tài)(持有股票和不持有股票),所以我們 的dp數(shù)組也應該是二維的dp[i][0/1],第一維表示天數(shù),第二維表示是否持有股票,dp[i][0/1]就表示第i天持有或者不持有股票的最大金額。
那么對于dp[i][0]而言 第i天是持有股票狀態(tài),那么當前狀態(tài)可能是因為上一天就已經(jīng)持有股票即dp[i-1][0],也可能是因為今天才剛剛買入股票那么對應的金額就是-prices[i].
而對于dp[i][1],第i天不持有股票,可能是因為上一天就沒有股票dp[i-1][1],也可能是因為今天才剛剛賣出股票即dp[i-1][0] + prices[i].
那么我們已經(jīng)理清的遍歷過程和遞推過程,dp數(shù)組的初始化就很明顯應該初始化dp[0][0] = -prices[0]和dp[0][1] = 0;
class Solution {
public int maxProfit(int[] prices) {
if (prices.length == 0 || prices == null) return 0;
int[][] dp = new int[prices.length][2];
dp[0][0] = -prices[0];
dp[0][1] = 0;
for (int i = 1; i < prices.length; i++) {
// 持有股票(前一天就持有或者今天才買入 選一個最大)
dp[i][0] = Math.max(dp[i-1][0],-prices[i]);
// 不持有(前一天就不持有或者今天才賣出 選最大的)
dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] + prices[i]);
}
return dp[prices.length -1][1];
}
}