代码随想录第49天|121. 买卖股票的最佳时机 122.买卖股票的最佳时机II

news2024/11/20 22:40:01

 121. 买卖股票的最佳时机 

121. 买卖股票的最佳时机 - 力扣(LeetCode)

代码随想录 (programmercarl.com)

动态规划之 LeetCode:121.买卖股票的最佳时机1_哔哩哔哩_bilibili

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

动规五部曲

1、确定dp数组以及下标的含义:dp[i][0] 表示第i天持有股票所得最多现金;

2、确定递推公式:

第i天持有股票为dp[i][0],这种状态可能由头一天的两种状态推出:

①、第i-1天就持有股票,头一天:dp[i - 1][0];

②、第i天就买如股票:所得现金:-price[i];

第i天不持有股票,即dp[i][1],这种状态也可能由头一天的两种状态推出:
①、第i-1天就不持有股票, 头一天:dp[i - 1][1]

②、第i天卖出股票,所得现金就是按照今天股票价格卖出后所得现金即:prices[i] + dp[i - 1][0]

3、dp数组如何初始化:

由递推公式基础都是要从dp[0][0]和dp[0][1]推导出来。那么dp[0][0]表示第0天持有股票,此时的持有股票就一定是买入股票了,因为不可能有前一天推出来,所以dp[0][0] -= prices[0];

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

4、确定遍历顺序:从前向后遍历

5、举例推导dp数组:

综合代码:

class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        
        // 定义一个二维数组 dp,大小为 len 行 2 列
        // dp[i][0] 表示第 i 天持有股票时的最大收益
        // dp[i][1] 表示第 i 天不持有股票时的最大收益
        int[][] dp = new int[len][2];
        
        // 初始化第一天的状态
        dp[0][0] = -prices[0]; // 第一天持有股票的收益为买入股票当天的价格的相反数
        dp[0][1] = 0; // 第一天不持有股票的收益为 0

        for (int i = 1; i < len; i++) {
            // 计算第 i 天持有股票的最大收益,取决于上一天持有股票的收益和当前买入股票的收益的较大者
            dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
            // 计算第 i 天不持有股票的最大收益,取决于上一天不持有股票的收益和当前卖出股票的收益的较大者
            dp[i][1] = Math.max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
        }
        // 返回最后一天不持有股票的收益
        return dp[len - 1][1];
    }
}

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

122. 买卖股票的最佳时机 II - 力扣(LeetCode)

代码随想录 (programmercarl.com)

动态规划,股票问题第二弹 | LeetCode:122.买卖股票的最佳时机II_哔哩哔哩_bilibili

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

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

如果第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]

综合代码:

class Solution {
    // 实现1:二维数组存储
    // 可以将每天持有与否的情况分别用 dp[i][0] 和 dp[i][1] 来进行存储
    // 时间复杂度:O(n),空间复杂度:O(n)
    public int maxProfit(int[] prices) { // 定义一个名为 Solution 的类,包含一个方法 maxProfit,接受一个整数数组 prices 作为参数,返回一个整数
        int n = prices.length; // 获取价格数组的长度
        int[][] dp = new int[n][2]; // 创建一个二维数组 dp 来存储状态,行数为价格数组的长度,列数为 2(0 表示不持有股票,1 表示持有股票)
        dp[0][0] = 0; // 初始化第一天不持有股票的收益为 0
        dp[0][1] = -prices[0]; // 初始化第一天持有股票的收益为买入股票当天的价格的相反数
        for (int i = 1; i < n; ++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], dp[i - 1][0] - prices[i]); // 计算第 i 天持有股票的最大收益,取决于上一天持有股票的收益和当前买入股票的收益的较大者
        }
        return dp[n - 1][0]; // 返回最后一天不持有股票的收益
    }
}

 

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

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

相关文章

为什么常用氢化物

知识星球&#xff08;星球名&#xff1a;芯片制造与封测社区&#xff09;里的学员问&#xff1a;diffusion工序&#xff0c;所需要的气体种类有哪些&#xff1f; Diffusion是什么工序&#xff1f; "Diffusion"工序是通过热能将掺杂剂原子扩散到硅片中&#xff0c;以形…

AD高速板设计--RJ45(笔记)

瑞芯微VS全志科技&#xff08;处理器芯片王者&#xff09; - 知乎 (zhihu.com) RTL8211E应用&#xff08;二&#xff09;之信号输入、输出接口_rtl8211eg中文资料-CSDN博客 Raspberry Pi 硬件 - Raspberry Pi 文档 RJ45接口的PCB设计布局布线注意事项 - 知乎 (zhihu.com) 以…

CTF之eval

首先我们先了解一下eval&#xff08;&#xff09;函数 什么是eval()? eval() 函数把字符串按照 PHP 代码来计算。 该字符串必须是合法的 PHP 代码&#xff0c;且必须以分号结尾。 如果没有在代码字符串中调用 return 语句&#xff0c;则返回 NULL。如果代码中存在解析错误…

OpenCV直方图计算

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV实现直方图均衡 下一篇 :OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::split 将图像划分…

Kubernetes中文件挂载的四种方式

一. Kubernetes入门 1.1 Kubernetes创建POD过程 1.2. Kubernetes基本操作 命令说明用法create创建kubectl create -f xx.yamledit编辑kubectl edit svc [POD的service名称]get获取kubectl get pod --namespaceXXXpatch更新kubectl patch -f xx.yamldelete删除kubectl delete …

[SWPUCTF-2022-新生赛]ez_sql

title:[SWPUCTF 2022 新生赛]ez_sql 审题 根据提示&#xff0c;POST传参 得到假的flag 判断类型 字符型注入 判断列数 发现空格和’or’被过滤 重新构造 nss-1/**/oorrder/**/by/**/4#发现为3个字段 采用联合注入union 爆库 发现union被过滤&#xff0c;双写union绕过 发…

sheng的学习笔记-AI-支持向量机(SVM)

目录&#xff1a;sheng的学习笔记-AI目录-CSDN博客 目录 什么是向量机 SVM算法原理 SVM基本模型 SVM对偶问题 什么是对偶问题&#xff1a; 为什么使用对偶问题 拉格朗日定理 拉格朗日乘子法 对偶问题算法 非线性SVM算法原理 核函数 常用核函数 软间隔与正则化 软…

PMBOK® 第六版 项目是什么

目录 读后感—PMBOK第六版 目录 项目定义 定义&#xff1a;项目是为创造独特的产品、服务或成果而进行的临时性工作。 项目的特征具备以下三点&#xff1a; 独特性&#xff1a;独一无二&#xff0c;无法简单重复过去的做法。 临时性&#xff1a;项目有明确的起点和终点&…

腾讯云邮件推送如何设置?群发邮件的技巧?

腾讯云邮件推送功能有哪些&#xff1f;怎么有效使用邮件推送&#xff1f; 腾讯云邮件推送以其稳定、高效的特点&#xff0c;受到了众多企业的青睐。那么&#xff0c;腾讯云邮件推送如何设置呢&#xff1f;又有哪些群发邮件的技巧呢&#xff1f;下面AokSend就来详细探讨一下。 …

AI预测体彩排列3第2套算法实战化测试第5弹2024年4月27日第5次测试

今天继续进行新算法的测试&#xff0c;今天是第5次测试。好了&#xff0c;废话不多说了&#xff0c;直接上图上结果。 2024年4月27日体彩排3预测结果 6码定位方案如下&#xff1a; 百位&#xff1a;6、2、1、7、8、9 十位&#xff1a;8、9、4、3、1、0 个位&#xff1a;3、7、8…

Python 数组控件的使用

当一个UI窗口界面内有多个相同类型的控件&#xff0c;且这多个控件的功能都类似时&#xff0c;使用数组控件是一个非常不错的选择&#xff0c;可以大大减少代码的编写 且 代码易读性强&#xff0c;可惜的是Python好象是没有数组控件这个东东。 我们来看看以下一个界面&#xff…

生成完美口型同步的 AI 代言人视频(及其实现原理详解)

目录 什么是Heygen? Heygen注册 Video Translation&#xff08;视频翻译 完美口型同步&#xff09; 实现原理详解 视频翻译部分 完美口型同步部分 什么是Heygen? Heygen是一款在线工具&#xff0c;可帮助您生成具有完美口型同步的 AI 代言人视频。 Heygen注册 https:…

SpringBoot 缓存

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 目录 一、缓存的作用二、SpringBoot启用缓存三…

循迹/跟随/摇头避障小车

循迹小车 智能小车2-循迹小车-CSDN博客 接线 B-1A -- PB0 B-1B -- PB1 A-1A -- PB2 A-1B -- PB10 循迹模块(左) -- PB3 循迹模块(右) -- PB4 CubeMx 在CubeMx配置,并重定义,在main.h会自动生成 #define B_1A_Pin GPIO_PIN_0 #define B_1A_GPIO_Port GPIOB #defi…

【开发问题记录】启动某个服务时请求失败(docker-componse创建容器时IP参数不正确)

问题记录 一、问题描述1.1 产生原因1.2 产生问题 二、问题解决2.1 找到自己的docker-compose.yml文件2.2 重新编辑docker-compose.yml文件2.3 通过docker-componse重新运行docker-compose.yml文件2.4 重新启动docker容器2.5 查看seata信息 一、问题描述 1.1 产生原因 因为我是…

【国标语音对讲】EasyCVR视频汇聚平台海康/大华/宇视摄像头GB28181语音对讲配置

一、背景分析 近年来&#xff0c;国内视频监控应用发展迅猛&#xff0c;系统接入规模不断扩大&#xff0c;涌现了大量平台提供商&#xff0c;平台提供商的接入协议各不相同&#xff0c;终端制造商需要给每款终端维护提供各种不同平台的软件版本&#xff0c;造成了极大的资源浪…

嵌入式学习58-ARM7(字符设备驱动框架led)

知识零碎&#xff1a; kernel 内核 printk 内核打印 cat /proc/devices insmod …

LINUX系统编程:软硬链接,动静态连接

1.硬连接 什么是硬连接?,我们或许可以用操作清楚的认识什么是硬连接。 在我们学习文件的时候这个数字好像完全没有被提到过&#xff0c;这个代表什么意思呢&#xff1f; 这个代表该文件的inode编号与文件映射的次数&#xff0c;现在该文件的inode只与test.c这个文件名映射&a…

使用grasshopper修改梁的起始点方向

一般北方向朝上的情况&#xff0c;梁的方向从南向北&#xff0c;从西向东。 现在使用grasshopper来判断起始点坐标&#xff0c;分辨是否错误。 交换起始点这个&#xff0c;我实在不会用电池操作&#xff0c;只好敲python代码实现了。代码如下&#xff1a; 如果会敲代码的同学…

Git | 远程操作

Git | 远程操作 文章目录 Git | 远程操作0、分布式版本控制系统概念1、创建远程仓库2、克隆远程仓库https方式ssh方式 3、推送至远程仓库4、本地拉取远程仓库5、配置Git忽略特殊文件给命令配置别名 6、标签管理创建标签操作标签 0、分布式版本控制系统概念 Git是一个分布式版本…