最大股票收益
难度:
标签:
题目描述
代码结果
运行时间: 567 ms, 内存: 16.0 MB
/*
题目思路:
- 使用Java Stream来计算最大利润。
- Stream只能单向迭代,因此需要使用reduce方法维护两个状态:最小价格和最大利润。
*/
import java.util.stream.IntStream;
public class MaxProfitStream {
public int maxProfit(int[] prices) {
if (prices == null || prices.length == 0) {
return 0;
}
int[] result = IntStream.of(prices)
.reduce(new int[]{Integer.MAX_VALUE, 0}, (acc, price) -> {
int minPrice = Math.min(acc[0], price); // 更新最低买入价格
int maxProfit = Math.max(acc[1], price - minPrice); // 计算最大利润
return new int[]{minPrice, maxProfit}; // 返回新的状态
}, (a, b) -> b); // 合并结果(Stream不会并行,实际上不执行此操作)
return result[1]; // 返回最大利润
}
}
解释
方法:
该题解采用了动态规划的方法来解决问题。定义一个dp数组来存储达到不同预算条件下的最大利润。数组的每个元素dp[b]表示在预算b下能够获得的最大利润。对于每一对当前价格p和未来价格f,如果未来价格f大于当前价格p(即只有在有利润的情况下才进行考虑),则遍历预算从高到低,尝试在购买这个股票后更新最大利润。更新策略是比较不买这个股票时的利润(dp[b])与买了这个股票后的利润(dp[b-p] + f - p)的较大值。
时间复杂度:
O(n*budget)
空间复杂度:
O(budget)
代码细节讲解
🦆
在动态规划解法中,为什么选择从预算的上限向下到当前价格遍历,而不是从当前价格向上遍历?
▷🦆
在更新dp数组时,`dp[b] = max(dp[b], dp[b-p] + f - p)`这个公式中,为什么我们可以直接使用dp[b-p],而不担心它是在本次循环中更新过的?
▷🦆
如果存在多个股票的当前价格和未来价格相同,该算法是否仍然有效?会不会导致重复计算同一种可能性?
▷🦆
你能解释为什么在股票的未来价格小于或等于当前价格时直接跳过不处理,这种处理方式是否可能错过某些利润机会?
▷