给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
解法一
贪心
class Solution {
public int maxProfit(int[] prices) {
if (prices.length == 1) return 0;
//每次都是今天买明天卖,如果跌了,不进行相加,即撤销这次操作
//卖掉昨天买的,如果今天再买入,把差价相加,如果差价为负,跳过
int maxSum = 0;
for (int i = 1; i < prices.length; i++) {
//如果今天的股价大于昨天的,加入maxSum,否则加0
if (prices[i] - prices[i - 1] > 0) {
maxSum = maxSum + prices[i] - prices[i - 1];
}
}
return maxSum;
}
}
这道题贪心应该是最优解了,而且容易理解,当天买隔天卖,如果是负的就反悔,只加正收益。
解法二
动态规划
class Solution {
public int maxProfit(int[] prices) {
//动态规划
int len = prices.length;
//第一行:买入
//第二行:卖出
int[][] dp = new int[2][len];
dp[0][0] = -prices[0]; //第一天买入后的状态
dp[1][0] = 0; //第一天卖出后的状态
for (int i = 1; i < len; i++) {
//今天的卖出价减去昨天的买入价,和昨天的买入价进行比较,保存大的值(就是比较这两天买入价的大小)
dp[0][i] = Math.max(dp[1][i - 1] - prices[i], dp[0][i - 1]);
//今天卖出价减去昨天买入价,和昨天卖出价进行比较,保存大的值
dp[1][i] = Math.max(prices[i] + dp[0][i - 1], dp[1][i - 1]);
}
return Math.max(dp[0][len - 1], dp[1][len - 1]);
}
}
动态规划优化
class Solution {
public int maxProfit(int[] prices) {
//动态规划优化
int len = prices.length;
//第一行:买入
//第二行:卖出
int[] dp = new int[2];
dp[0] = -prices[0]; //第一天买入后的状态
dp[1] = 0; //第一天卖出后的状态
for (int i = 1; i < len; i++) {
int temp = dp[0]; //保存前一天的买入价
dp[0] = Math.max(dp[1] - prices[i], temp); //修改买入价
dp[1] = Math.max(prices[i] + temp, dp[1]); //修改卖出价
}
return Math.max(dp[0], dp[1]);
}
}
动态规划的题老是没思路,不知道怎么下手,o(╥﹏╥)o。
动态规划思路来着王尼玛
大佬的题解。