LeetCode 股票系列(二)

简介: LeetCode 股票系列(二)

今天我们来继续聊聊 Leetcode 的华尔街之狼(The Wolf of Wall Street)系列,也称股票系列, 在 Leetcode 上有 6 题之多。

今天讲解的是第二题,与第一题相比升级了一点难度,我们一起来看下。


2. Best Time to Buy and Sell Stock III

与第一题类似,给你一组数组 prices=[3,3,5,0,0,3,1,4]

prices[i] 代表在第 i 天股票的价格,可以进行买卖操作,但得先买了才能卖。

这一次,你最多进行2次买与卖的操作,问你能够赚到的最大收益是多少?

比如这个例子中,我们在第四天买第六天卖,和在第七天买第八天卖,我们可以得到 (3-0)+(4-1)=6,这是我们能得到的最大收益。

问题分析 :

这道题升级了一点难度,可以进行两次的交易,但是只要打好了第一题的基础,这题也并不会太难的。

我们已经通过了第一题学会了如何计算最多进行一次买卖操作的最大利润,我们将通过已经计算好的一次交易最大利润去计算两次的是多少。

假设我们第一次 发生在 i,那么我们第一次交易得发生在 prices[0 : i], 而我们第二次交易得发生在 prices[i+1 : n]

  • 对于第一次交易,我们可以像第一题的 方法 3 一样,我们枚举每一次,我们只需要再找到 prices[i+1 : n] 的一次最大利润操作即可。
  • 对于 prices[i+1 : n] 这一段,我们可以枚举,如果买发生在 prices[i],那么卖得发生在 prices[i+1 : n]

方法1:

public int maxProfit(int[] A) {
        int n = A.length;
        int maxProfit = 0;
    //dp[i] 代表 prices[i:n] 能得到的最大一次交易利润,也就是我们的第二次操作。
        int dp[] = new int[n];
        int maxSell = A[n-1];
        for (int i = n - 2; i >= 0; i--) {
        //maxSell-A[i] 代表如果我们在i这天进行购买的话的最大利润
            dp[i] = Math.max(dp[i+1], maxSell - A[i]);
            maxSell = Math.max(maxSell, A[i]);
            maxProfit = Math.max(maxProfit, dp[i]);
        }
        int minBuy = A[0];
        for (int i = 1; i < A.length - 1; i++) {
        //假设我们第一次卖发生在i,买得发生在prices[0:i-1]
        //第二次操作发生在prices[i+1 : n],dp[i+1]表示prices[i+1 : n]这段区间进行一次操作的最大值
            maxProfit = Math.max(maxProfit, dp[i + 1] + (A[i] - minBuy));
            minBuy = Math.min(minBuy, A[i]);
        }
        return maxProfit;
    }

代码总结:

  • 我们枚举第一次的卖发生在 i,那么第一次操作发生在prices[0 : i],而第二次操作发生在 prices[i+1 : n]
  • 我们可以提前对 prices[i+1 : n] 进行提前处理。
  • dp[i] 代表 prices[i : n] 最大利润的一次交易,我们可以像第一题的题解3一样去枚举
  • 再枚举第一次交易的卖,如果它发生在 i,我们能得到的最大利润就是prices[i] - min(prices[0 : i-1]) + dp[i+1]

空间复杂度和时间复杂度:

  • 时间复杂度:O(N)
  • 空间复杂度:O(N)


目录
相关文章
|
6月前
|
算法
《LeetCode》—— 买卖股票的最佳时机
《LeetCode》—— 买卖股票的最佳时机
|
3月前
|
算法 Python
【Leetcode刷题Python】309. 最佳买卖股票时机含冷冻期
解决LeetCode上309题“最佳买卖股票时机含冷冻期”的Python代码示例,利用动态规划方法计算在含有冷冻期约束下的最大利润。
44 1
|
6月前
|
算法 索引
leetcode代码记录(买卖股票的最佳时机
leetcode代码记录(买卖股票的最佳时机
38 1
|
3月前
|
算法 Python
【Leetcode刷题Python】121. 买卖股票的最佳时机
解决LeetCode上121题“买卖股票的最佳时机”的Python代码示例,采用一次遍历的方式寻找最佳买卖时机以获得最大利润。
62 1
|
3月前
|
算法
leetcode188 买卖股票的最佳时机IV
leetcode188 买卖股票的最佳时机IV
62 0
|
3月前
|
算法 Python
【Leetcode刷题Python】714. 买卖股票的最佳时机含手续费
提供了两种解决买卖股票最佳时机含手续费问题的Python实现方法:贪心算法和动态规划算法。
47 0
|
3月前
|
算法 Python
【Leetcode刷题Python】122.买卖股票的最佳时机 II
LeetCode "买卖股票的最佳时机 II" 问题的Python代码实现,采用贪心算法在股票价格上升的每一天买入并卖出,以获得最大利润。
21 0
|
5月前
|
算法
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
【经典LeetCode算法题目专栏分类】【第10期】排序问题、股票问题与TOP K问题:翻转对、买卖股票最佳时机、数组中第K个最大/最小元素
|
5月前
|
算法
leetcode题解:121.买卖股票的最佳时机
leetcode题解:121.买卖股票的最佳时机
41 0
|
6月前
|
算法
leetcode代码记录(买卖股票的最佳时机 III
leetcode代码记录(买卖股票的最佳时机 III
36 5