题目:
题解一:贪心
每天利润:第二天卖出 - 第一天买入
最大利润:正利润之和
public int maxProfit(int[] prices) {
int result = 0;
for (int i = 1; i < prices.length; i++) {
result += Math.max(prices[i] - prices[i-1], 0);
}
return result;
}
时间复杂度:0(n)
题解二:动态规划
定义状态:
- dp[i][0]: 第 i 天持有股票的最大利润
- dp[i][1]: 第 i 天未持有股票的最大利润
dp[i][0] 状态方程:如果前一天已经持有一支股票,那么今天的股票不能在买入,利润取前一天已持有股票利润(dp[i-1][0]);如果前一天没有股票,这时候应该买入今天的股票,并减少price[i]收益。
dp[i][0] = max(dp[i-1][0], dp[i-1][1] - price[i])
dp[i][1] 状态方程: 如果今天的股票不买入,那么利润取前一天未持有股票利润(dp[i-1][1]),如果购入今天的股票,购入后应该将其卖出,获取利润price[i]。
dp[i][1] = max(dp[i-1][1], dp[i-1][0] + price[i])
全部交易结束之后,最后一天将股票卖出的利润 dp[n-1][1],一定大于持有股票的的利润 dp[n-1][0],所以直接返回 dp[n-1][1]。
public int maxProfit(int[] prices) {
int[][] dp = new int[prices.length][2];
dp[0][0] = -prices[0];
dp[0][1] = 0;
int n = prices.length;
for (int i = 1; i < n; i++) {
dp[i][0] = Math.max(dp[i-1][0], dp[i-1][1] - prices[i]);
dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]);
}
return dp[n - 1][1];
}
时间复杂度:O(n)