LEETCODE 122. 买卖股票的最佳时机 II
1. 问题
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
示例 2:
示例 3:
提示:
1 <= prices.length <= 3 * 10 ^ 4
0 <= prices[i] <= 10 ^ 4
2. 标签
贪心
动态规划
3. 解法 - 贪心
因为交易次数不受限,如果可以把所有的上坡全部收集到,一定是利益最大化的。
——seven
3.1 Java
3.2 复杂度分析
时间复杂度
O(n)
:其中 n 为数组长度,遍历一遍数组即可。空间复杂度
O(1)
:仅使用了常数空间存放变量。
3. 解法 - 动态规划
每一天的状态只与前一天的状态有关,而与更早的状态都无关,因此我们不必存储这些无关的状态,只需要将 dp[i−1][0] 和 dp[i−1][1] 存放在两个变量中,通过它们计算出 dp[i][0] 和 dp[i][1] 并存回对应的变量,以便于第 i+1i+1 天的状态转移即可。
可以通过上述操作优化空间复杂度至
O(1)
。
3.1 Java
3.2 复杂度分析
时间复杂度
O(n)
:其中 n 为数组的长度。一共有 2n 个状态,每次状态转移的时间复杂度为O(1)
,因此时间复杂度为O(2n)
即O(n)
。空间复杂度
O(n)
:我们需要开辟O(n)
空间存储动态规划中的所有状态。如果使用空间优化,空间复杂度可以优化至 O(1)。
4. 参考
最后更新于