代码随想录算法训练营day49|121. 买卖股票的最佳时机 |122.买卖股票的最佳时机II

news2024/12/26 22:53:58

121. 买卖股票的最佳时机

力扣题目链接

给定一个数组 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。

  • 贪心

因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。

class Solution {
    public int maxProfit(int[] prices) {
        int low=Integer.MAX_VALUE;
        int res=0;
        for(int i=0;i<prices.length;i++){
            low=Math.min(low,prices[i]);   // 取最左最小价格
            res=Math.max(prices[i]-low,res);  // 直接取最大区间利润
        }
        return res;
    }
}
  • 时间复杂度:O(n)

  • 空间复杂度:O(1)

  • 动态规划

1.确定dp数组(dp table)以及下标的含义

dp[i][0] 表示第i天持有股票所得最多现金

dp[i][1] 表示第i天不持有股票所得最多现金

2.确定递推公式

如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来

  • 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
  • 第i天买入股票,所得现金就是买入今天的股票后所得现金即:-prices[i]

那么dp[i][0]应该选所得现金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);

如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来

  • 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
  • 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]

同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);

3.初始化

都是要从dp[0][0]dp[0][1]推导出来

dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0

dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0][0]=-prices[0];

4.遍历顺序

前向后

5.打印dp数组

以示例1,输入:[7,1,5,3,6,4]为例,dp数组状态如下:

121.买卖股票的最佳时机

dp[5][1]就是最终结果。

为什么不是dp[5][0]呢?

因为本题中不持有股票状态所得金钱一定比持有股票状态得到的多!

class Solution {
    public int maxProfit(int[] prices) {
        int[][] dp=new int[prices.length+1][2];

        dp[0][0]=-prices[0];
        dp[0][1]=0;
        for(int i=1;i<prices.length;i++){
            dp[i][0]=Math.max(dp[i-1][0],-prices[i]);
            dp[i][1]=Math.max(dp[i-1][1],prices[i]+dp[i-1][0]);
        }
        return dp[prices.length-1][1];
    }
}

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

力扣题目链接

给定一个数组,它的第 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

  • 动态规划

1.确定dp数组(dp table)以及下标的含义

dp[i][0] 表示第i天持有股票所得最多现金

dp[i][1] 表示第i天不持有股票所得最多现金

2.确定递推公式

如果第i天持有股票即dp[i][0], 那么可以由两个状态推出来

  • 第i-1天就持有股票,那么就保持现状,所得现金就是昨天持有股票的所得现金 即:dp[i - 1][0]
  • 如果是第i天买入股票,所得现金就是昨天不持有股票的所得现金 减去 今天的股票价格 :dp[i - 1][1]-prices[i]

如果第i天不持有股票即dp[i][1], 也可以由两个状态推出来

  • 第i-1天就不持有股票,那么就保持现状,所得现金就是昨天不持有股票的所得现金 即:dp[i - 1][1]
  • 第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]

同样dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);

3.初始化

都是要从dp[0][0]dp[0][1]推导出来

dp[0][1]表示第0天不持有股票,不持有股票那么现金就是0,所以dp[0][1] = 0

dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0][0]=-prices[0];

4.遍历顺序

前向后

5.打印dp数组

class Solution {
    public int maxProfit(int[] prices) {
        int[][] dp=new int[prices.length+1][2];

        dp[0][0]=-prices[0];
        dp[0][1]=0;
        for(int i=1;i<prices.length;i++){
            dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);
            dp[i][1]=Math.max(dp[i-1][1],prices[i]+dp[i-1][0]);

        }
        return dp[prices.length-1][1];

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1003236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

气象监测站的分类及应用领域

随着全球气候变化的加剧&#xff0c;气象监测站的角色变得越来越重要。本文将介绍气象监测设备的分类&#xff0c;探讨其应用领域&#xff0c;帮助用户更好的理解气象监测站。 一、气象监测设备分类 气象监测设备主要包括以下几类&#xff1a; 自动气象站&#xff1a;自动气象…

vue中的 render 和 h() 详解

vue中的 render 和 h() 详解 当使用Vue.js进行前端开发时&#xff0c;理解和掌握"render"函数和"h()"函数是非常重要的&#xff0c;因为它们是Vue组件的核心构建和渲染部分 render 和 h()是在Vue.js中常用的两个概念&#xff0c;它们通常用于创建和渲染Vue…

【算法与数据结构】235、LeetCode二叉搜索树的最近公共祖先

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题和这道题类似【算法与数据结构】236、LeetCode二叉树的最近公共祖先&#xff0c;相同的算法也能解…

2023-9-12 01背包问题

题目链接&#xff1a; 朴素版本 #include <iostream> #include <algorithm>using namespace std;const int N 1010;int n, m; int f[N][N]; int v[N], w[N];int main() {cin >> n >> m;for(int i 1; i < n; i) cin >> v[i] >> w[i];…

Java线上故障排查(CPU、磁盘、内存、网络、GC)+JVM性能调优监控工具+JVM常用参数和命令

CPU 原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的&#xff0c;可以使用jstack来分析对应的堆栈情况。 使用jstack分析cpu问题 jstack主要用来查看某个Java进程内的线程堆栈信息 命令行参数说明&#xff1a; -l l…

ardupilot开发 --- 通信链路 篇

几个有意思的概图 飞控 以公司正在使用的 cuav Pixhawk V6X 为例 https://www.cuav.net/v6x/ 数传、飞控的mavlink连接 数传模块主要用于无人机于地面站共享数据&#xff0c;地面站通过数传可以获取无人机数据并且可以发送控制指令&#xff1b;与飞控的mavlink连接可以分为有…

文件压缩成压缩包,解压压缩包

压缩文件操作的工具类&#xff0c;压缩文件调用zip方法 package com.citicsc.galaxy.utils;import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Enumeration…

重磅:百度李彦宏、中科院曾毅入选,《时代周刊》AI最有影响力100人!

2023年9月8日&#xff0c;《时代周刊》发布了“2023年AI领域最有影响力100人” 榜单。 榜单权威吗&#xff1f; 有必要介绍下《时代周刊》。 《Time》&#xff08;时代周刊&#xff09;,1923年创刊于纽约&#xff0c;是美国公认的最重要的新闻杂志之一。《时代周刊》以报道精彩…

mybatis 中BigDecimal中的0存为null的坑

问题点: 做mybatis的插入和修改操作时&#xff0c;java中类型为Bigdicemal时&#xff0c;且值为0时&#xff0c;存入到数据库中的值为null&#xff0c;而不是0&#xff0c;其它的非0值正常 部分代码如下: 有问题的属性 可以看到是 Begdecimal 类型,对应查出来的日志如下: 可以…

chrome控制台怎么看hover的样式

​ 1. 悬浮显示是通过css控制台的 点击styles下面的 &#xff1a;hov&#xff0c;然后选中hover就可以了 2.如果是js控制的 js 失去悬浮以后&#xff0c;浮层就会隐藏&#xff0c;这个时候选中hover是没用的。 那怎么保留悬浮的状态呢&#xff0c;直接右键&#xff0c;会弹…

【Python】从入门到上头— 多线程(9)

进程和线程的区别 详见【Java基础】多线程从入门到掌握第一节(一.多线程基础) 一. _thread模块和threading模块 Python的标准库提供了两个模块&#xff1a;_thread和threading&#xff0c;_thread是低级模块&#xff0c;threading是高级模块&#xff0c;对_thread进行了封装。…

菜单组件Menu

前面讲解了如果构建GUI界面&#xff0c;其实就是把一些GUI的组件&#xff0c;按照一定的布局放入到容器中展示就可以了。在实际开发中&#xff0c;除了主界面&#xff0c;还有一类比较重要的内容就是菜单相关组件&#xff0c;可以通过菜单相关组件很方便的使用特定的功能&#…

在历史长河中,这个震撼了我!

在一个人的一生中&#xff0c;很容易低估世界发生的变化。 科技能够用我们无法想象的方式改变世界&#xff0c;直到它们真的发生。 咱们回顾这个世界的技术史&#xff0c;有助于看清楚未来几年甚至几十年内可能发生的改变。 我们的祖辈在童年时代&#xff0c;很难想象出会有一个…

从9.10拼多多笔试第四题产生的01背包感悟

文章目录 题面基本的01背包问题本题变式 本文参考&#xff1a; 9.10拼多多笔试ak_牛客网 (nowcoder.com) 拼多多 秋招 2023.09.10 编程题目与题解 (xiaohongshu.com) 题面 拼多多9.10笔试的最后一题&#xff0c;是一道比较好的01背包变式问题&#xff0c;可以学习其解法加深对…

手搓消息队列【RabbitMQ版】

什么是消息队列&#xff1f; 阻塞队列&#xff08;Blocking Queue&#xff09;-> 生产者消费者模型 &#xff08;是在一个进程内&#xff09;所谓的消息队列&#xff0c;就是把阻塞队列这样的数据结构&#xff0c;单独提取成了一个程序&#xff0c;进行独立部署~ --------&…

工具教程【甜心转译】-双语字幕、中文语音生成(配音),打破信息差

甜心转译 &#xff08;主站&#xff09;是一款AI加持的音/视频生成双语字幕、中文语音的软件。帮助人们更容易的获取外语信息、不管是学习、还是娱乐&#xff0c;快人一步。 主要功能 字幕生成&#xff1a;只需几个简单的步骤&#xff0c;轻松生成字幕。字幕翻译&#xff1a;…

【校招VIP】java语言考点之异常

考点介绍&#xff1a; 导致程序的正常流程被中断的事件&#xff0c;叫做异常。异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的。异常发生的原因有很多&#xff0c;通常包含以下几大类: 1.用户输入了非法数据。2.要打开的…

【Python】爬虫基础

爬虫是一种模拟浏览器实现&#xff0c;用以抓取网站信息的程序或者脚本。常见的爬虫有三大类&#xff1a; 通用式爬虫&#xff1a;通用式爬虫用以爬取一整个网页的信息。 聚焦式爬虫&#xff1a;聚焦式爬虫可以在通用式爬虫爬取到的一整个网页的信息基础上只选取一部分所需的…

首家!亚信科技AntDB数据库完成中国信通院数据库迁移工具专项测试

近日&#xff0c;在中国信通院“可信数据库”数据库迁移工具专项测试中&#xff0c;湖南亚信安慧科技有限公司&#xff08;简称&#xff1a;亚信安慧科技&#xff09;数据库数据同步平台V2.1产品依据《数据库迁移工具能力要求》、结合亚信科技AntDB分布式关系型数据库产品&…

pinduoduo(商品详情)API接口

为了进行电商平台 的API开发&#xff0c;首先我们需要做下面几件事情。 1&#xff09;开发者注册一个账号 2&#xff09;然后为每个pinduoduo应用注册一个应用程序键&#xff08;App Key) 。 3&#xff09;下载pinduoduo API的SDK并掌握基本的API基础知识和调用 4&#xff…