力扣第122题 买卖股票的最佳时机 ll c++ 贪心 + 动态规划

题目

122. 买卖股票的最佳时机 II

中等

相关标签

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

示例 1:

输入:prices = [7,1,5,3,6,4]
输出:7
解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3 。
     总利润为 4 + 3 = 7 。

示例 2:

输入:prices = [1,2,3,4,5]
输出:4
解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4 。
     总利润为 4 。

示例 3:

输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 交易无法获得正利润,所以不参与交易可以获得最大利润,最大利润为 0 。

提示:

  • 1 <= prices.length <= 3 * 104
  • 0 <= prices[i] <= 104

思路和解题方法 一 (贪心)

  1. int ans;:定义一个整型变量 ans,用于保存最大收益的结果。

  2. for(int i = 0; i < prices.size()-1; i++) { ... }:遍历股票价格数组 prices,从第一个元素遍历到倒数第二个元素。

  3. if(prices[i+1] > prices[i]) { ... }:如果后一天的股价比前一天高。

  4. ans += prices[i+1] - prices[i];:计算后一天股价与前一天股价的差值,并累加到最大收益结果 ans 中。

  5. return ans;:返回最大收益结果。

复杂度

        时间复杂度:

                O(n)

时间复杂度为O(n),其中n是股票价格数组的长度。由于代码只需一次遍历数组,因此时间复杂度与数组的长度成线性关系。

        空间复杂度

                O(1)

空间复杂度为O(1),代码中只使用了一个整型变量来保存最大收益结果,没有使用额外的数据结构,因此空间复杂度是常数级别的。无论输入规模如何增加,所需的额外空间都保持不变。

c++ 代码 一

class Solution {
public:
    // 计算最大收益函数
    int maxProfit(vector& prices) {
        int ans;  // 用于保存最大收益的变量
        // 遍历股票价格数组
        for(int i = 0; i < prices.size()-1; i++) {
            // 如果后一天的股价高于前一天
            if(prices[i+1] > prices[i]) {
                // 计算差值并累加到最大收益中
                ans += prices[i+1] - prices[i];
            }
        }
        // 返回最大收益结果
        return ans;
    }
};

 思路和解题方法 二 (动态规划)

  1. int n = prices.size();:获取股票价格数组的长度。

  2. vector> dp(n, vector(2, 0));:创建一个二维数组 dp,用于保存动态规划的结果。dp[i][0]表示第i天持有股票后剩余的最多现金,dp[i][1]表示第i天持有的最多现金。

  3. dp[0][0] -= prices[0];:初始化第一天持有股票的现金。因为是第一天,所以将购买第一天的股票的成本从现金中减去。

  4. for (int i = 1; i < n; i++) { ... }:从第二天开始遍历股票价格数组。

  5. dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);:计算第i天持有股票后剩余的最多现金。第i天的状态可以由前一天持有股票的现金和前一天没有股票但购买第i天股票的现金两种情况取较大值。

  6. dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);:计算第i天持有的最多现金。第i天的状态可以由前一天持有股票的最多现金和前一天没有股票但卖出第i天股票的最多现金两种情况取较大值。

  7. return max(dp[n - 1][0], dp[n - 1][1]);:返回最后一天持有股票后剩余的最多现金和持有的最多现金中的较大值,即最大收益。

复杂度

        时间复杂度:

                O(n)

时间复杂度分析:代码中使用了一个for循环,循环次数为n-1,其中n为股票价格数组的长度。在每个循环中,进行了常数级别的操作,所以总时间复杂度为O(n)。

        空间复杂度

                O(n)

空间复杂度分析:代码中使用了一个二维数组dp,数组大小为n*2。所以空间复杂度为O(n)。

c++ 代码 二

class Solution {
public:
    int maxProfit(vector& prices) {
        int n = prices.size();  // 股票价格数组的长度
        vector> dp(n, vector(2, 0));  // 用于保存动态规划的结果

        // 初始化第一天的状态
        dp[0][0] -= prices[0];  // 持有股票的现金
        // 注意:dp[0][1]表示第一天没有股票,所以不需要初始化

        // 动态规划计算
        for (int i = 1; i < n; i++) {
            // 计算第i天持有股票后剩余最多现金
            dp[i][0] = max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
            // 计算第i天持有最多现金
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }

        // 返回最大收益
        return max(dp[n - 1][0], dp[n - 1][1]);
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

你可能感兴趣的:(leetcode,贪心,数据结构,leetcode,c++,算法,贪心算法)