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

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

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

121.买卖股票的最佳时机

力扣题目链接(opens new window)

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

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

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

  • 示例 1:
  • 输入:[7,1,5,3,6,4]
  • 输出:5
    解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
  • 示例 2:
  • 输入:prices = [7,6,4,3,1]
  • 输出:0
    解释:在这种情况下, 没有交易完成, 所以最大利润为 0。

思路:贪心

这道题目用贪心可以解决,回顾下贪心算法
需要定义局部最优解和整体最优解
题目只要求买卖一次股票,并获取最大利润
要找到股票左侧最低点,并在右侧最高点卖出
找最低点和最高点的流程可以用一个For循环来解决
遍历数组prices,假设遍历的元素就是右侧最高点,在遍历过的元素中找到最低点,即为左侧最低点
计算利润差值即可
局部最优解:找到当前左侧的最低点,计算当前利润最大值
整体最优解:这笔交易中获取的最大利润
时间复杂度o(n)
空间复杂度o(1)

代码如下

public int maxProfit(int[] prices) {
    if (prices == null || prices.length == 0)
        return 0;
    int low = Integer.MAX_VALUE;
    int maxProfit = 0;
    for (int i = 0; i < prices.length; i++) {
        low = Math.min(low, prices[i]);
        maxProfit = Math.max(maxProfit, prices[i] - low);
    }
    return maxProfit;
}

思路:动态规划

思路:动态规划
股票类问题,动态规划解法是通用解法
动态规划五部曲
1.dp数组以及下标代表含义
之前做惯了背包类题目,习惯定义一维数组解决问题。不是背包类题目,要根据题意具体分析
定义一维数组dp[i],表示第i天从这笔交易中获取的最大利润。但买和卖这两种状态无法表示
因此定义二维数组dp[i][j]。j = 0 表示第i天不持有股票利润 j = 1表示第i天持有股票的利润
要用持有和不持有股票作为状态,不用出售和不出售作为状态(因为还要定义【保持卖出状态】和【保持买入状态】)
2.确定递推公式
第i天不持有股票。
1.第i-1天不持有股票 dp[i][0] = dp[i-1][0]
2.第i-1天持有股票  dp[i][0] = prices[i] + dp[i-1][1]
dp[i][0] = Math.max(dp[i-1][0],prices[i] + dp[i-1][1])
第i天持有股票
1.第i-1天不持有股票dp[i][1] = -price[i]
2.第i-1天持有股票dp[i][1] = dp[i-1][1]
 dp[i][1] = Math.max( -prices[i],dp[i-1][1])
3.dp数组初始化
dp[0][0] = 0 dp[0][1] = -prices[0]
4.遍历顺序,dp[i]由dp[i-1]推导,故正序
5.举例推导dp数组

时间复杂度o(n)
空间复杂度o(n)

代码如下

public static void main(String[] args) {
    int[] prices = new int[]{7, 1, 5, 3, 6, 4};
    maxProfit(prices);
}

public static int maxProfit(int[] prices) {
    if (prices == null || prices.length == 0)
        return 0;
    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], prices[i] + dp[i - 1][1]);
        dp[i][1] = Math.max(-prices[i], dp[i - 1][1]);
    }

    return dp[prices.length - 1][0];// 最后一天肯定不持有
}

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

力扣题目链接(opens new window)

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

  • 示例 1:
  • 输入: [7,1,5,3,6,4]
  • 输出: 7
    解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
  • 示例 2:
  • 输入: [1,2,3,4,5]
  • 输出: 4
    解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
  • 示例 3:
  • 输入: [7,6,4,3,1]
  • 输出: 0
    解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

提示:

  • 1 <= prices.length <= 3 * 10 ^ 4
  • 0 <= prices[i] <= 10 ^ 4

思路

思路:动态规划
思路和买卖股票的最佳时机类似,区别在于递推公式
dp[i][0] j = 0表示未持有,此部分逻辑不变
i- 1 持有股票:dp[i][0] = prices[i] + dp[i-1][1]
i- 1 未持有股票:dp[i][0] = dp[i-1][0]
dp[i][1] j = 1表示持有。i-1未持有股票逻辑变化
i- 1 持有股票:dp[i][1] = dp[i-1][1]
i- 1 未持有股票:dp[i][1] = dp[i-1][0] - prices[i] 变化在此处
因为股票可以买卖多次。当前未持有股票的利润,可能包含之前买卖股票的利润
所以需要用之前买卖股票的利润 - 当前持有股票的利润

代码如下文章来源地址https://www.toymoban.com/news/detail-796433.html

// 时间复杂度o(n)
// 空间复杂度o(n)
public int maxProfitII(int[] prices) {
    if (prices == null || prices.length == 0)
        return 0;
    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], prices[i] + dp[i - 1][1]);
        dp[i][1] = Math.max(dp[i - 1][0] - prices[i], dp[i - 1][1]);
    }

    return dp[prices.length - 1][0];// 最后一天肯定不持有
}

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

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

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

相关文章

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

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

    2024年02月15日
    浏览(41)
  • 力扣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日
    浏览(40)
  • Day32 贪心算法 part02 122. 买卖股票的最佳时机 II 55. 跳跃游戏 45. 跳跃游戏 II

    思路:计算每天的利润,利润如果为正,加到结果中去

    2024年01月19日
    浏览(44)
  • 122.买卖股票的最佳时机II(不限次数)

    labuladong的状态图解

    2024年02月04日
    浏览(58)
  • leetCode买卖股票的最佳时机II(题号122)

    122. 买卖股票的最佳时机 II 给你一个整数数组  prices  ,其中  prices[i]  表示某支股票第  i  天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候  最多  只能持有  一股  股票。你也可以先购买,然后在  同一天  出售。 返回  你能获得的  最大  

    2024年02月12日
    浏览(31)
  • 【DP】【贪心】122.买卖股票的最佳时机II

    题目 六种股票问题总结https://blog.csdn.net/weixin_47692079/article/details/117202705

    2024年01月19日
    浏览(40)
  • 代码随想录 第三十二天 45.跳跃游戏 II||122.买卖股票的最佳时机 II55. 跳跃游戏

    力扣题目链接(opens new window) 给定一个非负整数数组,你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例  1: 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位

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

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

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

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

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

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

    2024年02月20日
    浏览(33)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包