算法刷题|121.买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ

这篇具有很好参考价值的文章主要介绍了算法刷题|121.买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

买卖股票的最佳时机

题目:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

  • dp[i][0]表示第i天不持有股票的最大利润;dp[i][1]表示第i天持有股票的最大利润
  • 递推公式
    • 第i天不持有股票:dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]
      • 昨天本来就不持有:dp[i-1][0]
      • 昨天持有,但是今天卖了,所有今天也就不持有了:dp[i-1][1]+prices[i]
    • 第i天持有股票:dp[i][1] = Math.max(dp[i-1][1],0-prices[i])
      • 昨天本来就持有:dp[i-1][1]
      • 昨天本来没有,今天买了,就持有了,因为只能买卖一次,所有买的时候手里的利润一定是0:0-prices[i])
  • dp数组初始化:dp[0][0] = 0,dp[0][1] = -prices[0]
  • 遍历顺序:从小到大
  • 打印dp数组
class Solution {
    public int maxProfit(int[] prices) {
        // dp[i][0]表示第i天不持有股票的最大利润,dp[i][1]表示第i天持有股票的最大利润
        int[][] dp = new int[prices.length][2];
        // 初始化
        dp[0][0] = 0;
        // 持有股票,就要买入股票,利润肯定暂时是负数
        dp[0][1] = -prices[0];
        for(int i = 1;i<prices.length;i++){
            // 第i天不持有股票
            dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1]+prices[i]);
            // 第i天持有股票
            dp[i][1] = Math.max(dp[i-1][1],-prices[i]);
        }
        return dp[prices.length - 1][0];
    }
}

通过递推公式可以发现,当前第i天的是否持有股票只是和前一天有关系,所有我们可以使用两个变量来存储

class Solution {
    public int maxProfit(int[] prices) {
        // 初始化
        // 第0天不持有股票
        int dp_i_0 = 0;
        // 第0天持有股票
        int dp_i_1 = -prices[0];
        // 因为当前的天是否持有股票只和相邻的天有关系,所有我们可以采用两个变量存储,类似斐波那契数列的空间复杂度为O(1)的处理
        for(int i = 1;i<prices.length;i++){
            dp_i_0 = Math.max(dp_i_0,dp_i_1+prices[i]);
            dp_i_1 = Math.max(dp_i_1,-prices[i]);
        }
        return dp_i_0;
    }
}

买卖股票的最佳时机Ⅱ

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

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

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

思路:和买卖股票1的区别就是买卖股票1买入的时候手里的利润一定是0,而本题可以多次买入所有买入股票的时候手里的利润就不一定是0

class Solution {
    public int maxProfit(int[] prices) {
        int[][] dp = new int[prices.length][2];
        dp[0][0] = 0;
        dp[0][1] = -prices[0];
        for(int i = 1;i<prices.length;i++){
            dp[i][0] = Math.max(dp[i-1][0],dp[i-1][1] + prices[i]);
            // 因为可以多次买卖股票,所有这里手里的利润就不一定是0了,所以最大金额就要使用之前的利润减轻今天的股票价格
            dp[i][1] = Math.max(dp[i-1][1],dp[i-1][0] - prices[i]);
        }
        return dp[prices.length - 1][0];
    }
}

空间优化文章来源地址https://www.toymoban.com/news/detail-425618.html

class Solution {
    public int maxProfit(int[] prices) {
        int dp_i_0 = 0;
        int dp_i_1 = -prices[0];
        for(int i = 1;i<prices.length;i++){
            // 因为先计算的dp_i_0,所有计算dp_i_1的时候dp_i_0已经发生变化了,所有使用temp记录一下值
            int temp = dp_i_0;
            dp_i_0 = Math.max(dp_i_0,dp_i_1+prices[i]);
            dp_i_1 = Math.max(dp_i_1,temp-prices[i]);
        }
        return dp_i_0;
    }
}

到了这里,关于算法刷题|121.买卖股票的最佳时机、122.买卖股票的最佳时机Ⅱ的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 121. 买卖股票的最佳时机

    121. 买卖股票的最佳时机 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/

    2024年02月19日
    浏览(35)
  • 力扣 121. 买卖股票的最佳时机

    题目来源:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/ 好久没写代码了,啥啥都忘了 C++题解1:贪心算法。(来源代码随想录) 因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。 时间复杂度:O(n) 空

    2024年02月20日
    浏览(25)
  • 买卖股票的最佳时机【力扣121】

    假如我们要在第 i 天卖出股票,那么为了获得最大利润,买股票的最佳时间是第 i 天前的最低股价的那一天。 我们使用min来记录已经访问过的 0-i 天的最低股价。那么在第 i 天,如果股价大于min,那么最大利润为price[i]-min;否则最大利润为0,并且min=price[i]。

    2024年02月11日
    浏览(27)
  • 122. 买卖股票的最佳时机 II

      两题的本质是一样的,只不过含手续费多了一个手续费,手续费可以在买的时候一并扣掉就行。   这两题的关键在于到理解dp数组创建的意义,这两题dp数组创建的意义为 到今天为止,持有状态和未持有状态的最优情况 ,dp[i]就可以根据dp[i-1]也推出最优情况,只需要考

    2024年02月15日
    浏览(28)
  • leetcode121. 买卖股票的最佳时机

    题目: 给定一个数组  prices  ,它的第  i  个元素  prices[i]  表示一支给定股票第  i  天的价格。 你只能选择  某一天  买入这只股票,并选择在  未来的某一个不同的日子  卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大

    2024年02月10日
    浏览(37)
  • leetcode 121. 买卖股票的最佳时机

             本题用dp算法做, dp[i]的含义:前 i+1天能获得的最大利润 。 然后每次循环时需要维护一个最小值 min_num :即 i+1天中股票的最低价 。剩下的步骤都很常规,代码如下:         dp[i][0]:第i天持有股票所拥有的最多现金。          dp[i][1]:第i天不持有股票所拥有的最

    2024年02月12日
    浏览(26)
  • 【LeetCode】121.买卖股票的最佳时机

    给定一个数组  prices  ,它的第  i  个元素  prices[i]  表示一支给定股票第  i  天的价格。 你只能选择  某一天  买入这只股票,并选择在  未来的某一个不同的日子  卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如

    2024年02月15日
    浏览(26)
  • 力扣122. 买卖股票的最佳时机 II

    思路: 假设 dp[i][0] 是第 i 天手上没有股票时的最大利润, dp[i][1] 是第 i 天手上有 1 支股票的最大利润; dp[i][0] 的迁移状态为: dp[i - 1][0],前一天手上已经没有股票,没有发生交易; dp[i - 1][1] + prices[i],前一天手上有 1 支股票,第 i 天将其卖掉获得收益 prices[i]; 所以,

    2024年02月03日
    浏览(34)
  • [思维]LeetCode:121.买卖股票的最佳时机

      题目链接:121. 买卖股票的最佳时机 - 力扣(Leetcode)   分析:这里的数据大小为1e5,所以使用暴力会TLE. 思路:我们发现, 需要找到最大利润,其目标就是找到当前第i位后的最大值。换位思考,就是找到当前第i位前的最小值。

    2023年04月09日
    浏览(31)
  • 力扣(Leetcode) 121. 买卖股票的最佳时机

    给定一个数组  prices  ,它的第  i  个元素  prices[i]  表示一支给定股票第  i  天的价格。 你只能选择  某一天  买入这只股票,并选择在  未来的某一个不同的日子  卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易中获取的最大利润。如

    2024年01月25日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包