价格递增的最大利润三元组 II
难度:
标签:
题目描述
代码结果
运行时间: 280 ms, 内存: 24.9 MB
/*
* Solution for LeetCode problem 2921: 价格递增的最大利润三元组 II using Java Streams
* This approach leverages Java Streams to handle the operations more functionally.
*/
import java.util.stream.IntStream;
public class MaxProfitTripletStream {
public int maxProfit(int[] prices) {
int n = prices.length;
if (n < 3) return 0;
int[] leftMin = new int[n];
leftMin[0] = prices[0];
for (int i = 1; i < n; i++) {
leftMin[i] = Math.min(leftMin[i - 1], prices[i]);
}
return IntStream.range(1, n - 1).flatMap(j ->
IntStream.range(j + 1, n)
.filter(k -> prices[j] > leftMin[j - 1] && prices[k] > prices[j])
.map(k -> prices[k] - leftMin[j - 1])
).max().orElse(0);
}
public static void main(String[] args) {
MaxProfitTripletStream solution = new MaxProfitTripletStream();
int[] prices = {3, 1, 4, 1, 5, 9, 2, 6};
System.out.println(solution.maxProfit(prices)); // Output should be the maximum profit
}
}
解释
方法:
该题解采用了二分单调栈的方法来求解价格递增的最大利润三元组问题。首先,我们使用一个单调栈来维护一个由价格和利润组成的元组列表,确保随着价格的增加,相应的利润也是单调递增的。在遍历价格和利润数组时,我们尝试通过二分查找的方式找到当前价格能插入单调栈的位置,并根据这个位置更新可能的最大利润(通过之前的利润加上当前的利润)。第二次使用单调栈时,我们将DP值作为新的利润,以此来尝试更新最终的最大利润。
时间复杂度:
O(n log n)
空间复杂度:
O(n)
代码细节讲解
🦆
在题解中提到使用二分单调栈的方法,能否详细解释什么是单调栈以及它在这个问题中的具体作用是什么?
▷🦆
你如何确定在单调栈中使用二分查找来插入元素是一个有效的策略?这种策略在所有情况下都适用吗?
▷🦆
在题解中,提到了两次构建单调栈,这两次构建有何不同?第二次构建单调栈为什么要以DP值作为新的利润?
▷🦆
题解中提到了维护单调栈的过程中会删除一些元素,能否详细说明何时以及为什么需要进行这样的删除操作?
▷