LeetCode刷题之买卖股票的最佳时机

文章目录

  • 1. 买卖股票的最佳时机
    • 1.1 描述
    • 1.2 分析
    • 1.3 解答
  • 2.买卖股票的最佳时机II
    • 2.1 描述
    • 2.2 分析
    • 2.3 解答
    • 2.4 拓展
    • 2.5 拓展二

1. 买卖股票的最佳时机

题121 买卖股票的最佳时机

1.1 描述

给定一个数组 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.2 分析

获得最大利润,那就是要在最低的价格买入,最高的价格卖出,而且必定是先买入,后卖出。由于限定了是这笔交易,即只能交易一次,那就不能进行多次交易。
当知道今天的股票交易价格的时候,可以和前一天的交易价格比,更低价格的那天,是更合适的买入机会,即更低的价格,是成本。
与之相对应,卖的时候要价格更高的时候,是卖出的合适机会。我们可以记录每一天的买入、卖出的价格,把价格记录到结果中。

1.3 解答

 class Test {public int maxProfit(int[] prices) {int cost = Math.MAX_VALUE;int profit = 0;for (int price : prices) {cost = Math.min(cost, price);profit = Math.max(profit, price - cost);}return profit;}
}

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

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

2.1 描述

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

2.2 分析

这个问题和前一天问题最大的不同在于,可以进行多次买卖。那么每天都有两种情况,如果今天卖出股票,有多少profit,如果今天持有股票,又有多少profit?那么可以创建一个二维数组来表示,即dp[i][0]表示第i天的时候,卖出股票获得的最大利润是多少,dp[i][1]表示今天继续持有股票,当前的利润最大是多少?
若当前卖出股票,最大利润如何计算?即用当前的价格,减去前一天持有股票的成本,这个成本就是上一题讨论的前n天中相对成本较低的时候。
与之相对应,继续持有股票,那么今天的利润是前一天持有股票的相反数,即只花了钱买股票,没有卖出。

对于第i天,计算不持有股票时的最大利润dp[i][0],取前一天不持有股票的最大利润dp[i-1][0]和前一天持有股票的最大利润加上当天卖出股票的价格dp[i-1][1] + prices[i]的较大值。

对于第i天,计算持有股票时的最大利润dp[i][1],取前一天持有股票的最大利润dp[i-1][1]和前一天不持有股票的最大利润减去当天买入股票的价格dp[i-1][0] - prices[i]的较大值。

直到最后一天,股票一定要卖出了,再持有也是属于亏损了。
这里特别关照的是第一天的时候,卖出股票是没有可以卖的,因此这一天的利润就是0;第一天持有股票赚取的利润就是当天价格的相反数,因为只有花钱买了股票。

2.3 解答

class Solution {public int maxProfit(int[] prices) {if (prices.length < 2) {return 0;}		int len = prices.length;int[][] dp = new int[len][2];dp[0][0] = 0;dp[0][1] = -prices[0];for (int i = i; i < len; 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], pd[i - 1][0] - prices[i]);}return dp[len - 1][0];}
}

2.4 拓展

由于当前的利润,只和前一天的结果相关,那么也可以不用开辟二维数组存放,直接给定变量即可。

class Solution {public int maxProfit(int[] prices) {int len = prices.length;if (len < 2) {return 0;}int cash = 0;int stock = -prices[0];int preCash = 0;int preStock = stock;for (int price : prices) {cash = Math.max(preCash, preStock + price);stock = Math.max(preStock, preCash - price);preCash = cash;preStock = stock;}return cash;}
}

2.5 拓展二

此题也可以用贪心算法来求解。

贪心算法(Greedy algorithm)是一种基于贪心策略的算法设计方法。在贪心算法中,每一步都选择当前状态下的最优解,以期望最终获得全局最优解。贪心算法的核心思想是:每一步都做出在当前状态下看起来最好的选择,而不考虑该选择对未来的影响。

贪心算法通常适用于满足贪心选择性质和最优子结构的问题。贪心选择性质指的是通过选择当前最优解,能够得到全局最优解。最优子结构指的是问题的最优解包含了子问题的最优解。这些性质保证了贪心算法的可行性和正确性。

今天的股价-昨天的股价,只有三种结果:

  • 正数
  • 负数
  • 0
    那么要累计收益最大,那就只需要累加赚钱的情况,即所有都是赚钱的时候,那么就是利润最大的时刻。

贪心选择性质的证明:

借助 「差分」 这个概念,可以证明 「贪心算法」 的有效性。贪心算法是选择那些所有差分(严格)大于 0 的数,把它们相加即可。

使用反证法:

假设 「贪心算法」 得到的解并不是最优解,即我们还能够找到一个可行解比 「贪心算法」 得到的利润还多。差分数组中除了差分为正数的项以外,还有就是差分为 0 的项与差分为负数的项。「贪心算法」 是所有差分为正数的项的和。有以下 3种情况:

    1. 如果可行解在 「贪心算法」 的基础上,选择了差分为 0的项,得到的结果与「贪心算法」得到的结果一样,因此加上差分为 0 的项不会比「贪心算法」得到的结果更好;
    1. 如果可行解在 「贪心算法」 的基础上,选择了差分为负数的项,加上一个负数得到的结果一定比 「贪心算法」 得到的结果要少,加上差分为负数的项,一定比 「贪心算法」 得到的结果更少;
    1. 如果可行解在 「贪心算法」 的基础上,去掉了任何一个差分为正数的项,同上,得到的结果一定比 「贪心算法」 得到的结果要小,因此,「贪心算法」 的所有组成项不能删去任何一个。
public class Solution {public int maxProfit(int[] prices) {int len = prices.length;if (len < 2) {return 0;}int res = 0;for (int i = 1; i < len; i++) {res += Math.max(prices[i] - prices[i - 1], 0);}return res;}
}

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

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

相关文章

【Android学习】按钮监听代码

1. 简介 Button组件是Android中常用的组件&#xff0c;Button常需要和View.OnClickListener配合使用。这里记录下Button配置监听的过程。 2. 代码分析 2.1 Layout的XML代码 <Buttonandroid:id"id/btn"android:layout_width"match_parent"android:lay…

ThreeJS:响应式画布与全屏控制

响应式画布 响应式画布&#xff1a;在用户缩放浏览器窗口时&#xff0c;为便于动态更新画布尺寸与宽高比例&#xff0c;需要通过监听resize事件&#xff0c;来实现响应式画布。 window.onresize function () {//TODO:重置渲染器宽高比renderer.setSize(window.innerWidth, wi…

图文、视频处理等自媒体工具

文章目录 文本转文本图片canva同类竞品文本生成PDF,PDF再导出为图片贴入笔记类应用(如小米笔记App)中然后选择以图片形式分享UU在线工具的文字生成长图醒图App其他竞品文本转配音视频剪映将文本生成一段朗读该文本的配音视频(需要自行切割多段内容并分配时间轴)腾讯智影将…

为人处事电影解说,全新升级瀚海跑道一分钟一条视频,全平台可推广,轻轻松松日入1000

自古以来&#xff0c;我国流行的一种现象是&#xff0c;大多数人都会与领导或上司打交道。由于某些话题不宜公开讨论&#xff0c;因此出现了许多含蓄的表达方式。随着年龄的增长&#xff0c;人们的态度也发生了变化&#xff0c;从最初的轻视到现在的重视。 下 载 地 址&#…

VG做mirror引起的块偏移

事件起因 Oracle10.2环境 Aix操作系统使用aix的lvm技术。制作vg的mirror。以此来替换掉老的存储。 做mirror前&#xff0c;数据库已完全关闭 故障现象 在启动数据库时&#xff0c;发现IO错误。该系统的spfile&#xff0c;ctl&#xff0c;dbf均是用lv做的裸设备。其中dbf是使…

WebGL是啥

WebGL&#xff08;全写为Web Graphics Library&#xff09;是一种3D绘图协议&#xff0c;这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起&#xff0c;通过增加OpenGL ES 2.0的一个JavaScript绑定&#xff0c;WebGL可以为HTML5 Canvas提供硬件3D加速渲染。这样&…

【重学C语言】十二、指针高级-函数指针

【重学C语言】十二、指针高级-函数指针 函数指针小案例回调函数如何看懂复杂的指针右左法则案例走起1.int (\*p[5])(int\*)2. int (\*fun)(int \*p,int (\*pf)(int \*))3. int (\*(\*fun)[5])(int \*p)4. int (\*(\*fun)(int \*p))[5]5. int(\*(\*fun())())()函数指针 函数指针…

cmake的使用方法: 编译生成库文件

一. 简介 前面文章学习了针对单个 .c文件&#xff0c;cmake 工具是如何编译的&#xff1f; 针对包含多个 .c文件&#xff0c;cmake工具又是如何编译的&#xff1f;文章如下&#xff1a; cmake的使用方法: 单个源文件的编译-CSDN博客 cmake的使用方法: 多个源文件的编译-CS…

Java入门-final关键字

final关键字 修饰基本类型 变量为只读&#xff0c;不能修改变量的内容。 final int SIZE 3;修饰引用类型 引用的对象不能改变&#xff0c;但是对象的内容可以修改。 final Car c new Car( );c.setColor("红色");修饰类的属性 类的属性不能被修改。 第一种方式&…

Linux 进程间通信之命名管道

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 命名管道 创建一个命名管道 …

Pandas库的基本使用

什么是Pandas? 一个开源的Python类库&#xff1a;用于数据分析、数据处理、数据可视化 高性能容易使用的数据结构容易使用的数据分析工具 很方便和其它类库一起使用&#xff1a; numpy&#xff1a;用于数学计算scikit-learn&#xff1a;用于机器学习 怎样下载安装Pandas …

Flask后端之建立模型类间的外键联系

1、模型类代码&#xff1a; 定义了三个模型类&#xff1a;User、Goods 和 Sign&#xff1a; class User(db.Model):__tablename__ userid db.Column(db.Integer, primary_keyTrue)name db.Column(db.String(100), nullableFalse)email db.Column(db.String(100), uniqueT…

商城数据库(36 37 38 39 40)

36 CREATE TABLE sxh_log_operates (operateId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,staffId int(11) NOT NULL DEFAULT 0 COMMENT 职员ID,operateTime datetime NOT NULL COMMENT 操作时间,menuId int(11) NOT NULL COMMENT 所属菜单ID,operateDesc varchar(255)…

UI自动化与接口自动化比较

UI自动化与接口自动化优比较&#xff1a; 1、执行效率 接口自动化执行效率比UI自动化执行效率更高(调用接口比打开页面要快很多) 2、稳定性 UI自动化容易受设备卡顿&#xff0c;系统弹框等因素影响而导致脚本执行失败、接口自动化不存在此问题&#xff0c;因此接口自动化测试…

ES常用查询方式

Elasticsearch&#xff08;ES&#xff09;作为功能强大的检索引擎&#xff0c;提供了多种查询方式&#xff0c;在不同的场景下需要选择合适的查询方式以取得最佳查询效果。 ES常用查询方式 方式说明Match Query&#xff08;匹配查询&#xff09;根据字段的内容进行全文匹配查…

Leetcode—976. 三角形的最大周长【简单】(ranges::sort函数)

2024每日刷题&#xff08;122&#xff09; Leetcode—976. 三角形的最大周长 实现代码 class Solution { public:int largestPerimeter(vector<int>& nums) {ranges::sort(nums);for(int i nums.size() - 1; i > 1; i--) {if(nums[i - 1] nums[i - 2] > nu…

洛谷 P1377 [TJOI2011]:树的序 ← 笛卡尔树

【题目来源】https://www.luogu.com.cn/problem/P1377【题目描述】 众所周知&#xff0c;二叉查找树的形态和键值的插入顺序密切相关。准确的讲&#xff1a; 1.空树中加入一个键值 k&#xff0c;则变为只有一个结点的二叉查找树&#xff0c;此结点的键值即为 k。 2.在非空树中插…

『大模型笔记』AI 智能体(Agent)在推理(Reasoning)、规划(Planning)与工具调度(Tool Calling)方面的研究:综合调查!

AI 智能体(Agent)在推理(Reasoning)、规划(Planning)与工具调度(Tool Calling)方面的研究:综合调查! 文章目录 o. 摘要一. Introduction1.1. Taxonomy(分类学)二. 关键考虑因素以实现有效的智能体2.1. 概述2.2. 推理和规划的重要性2.3. 有效工具调用的重要性三. 单智能体架…

智能物联网与Web3:连接未来数字生活的桥梁

随着科技的不断进步&#xff0c;智能物联网&#xff08;IoT&#xff09;和Web3技术正成为数字化时代的关键驱动力。智能物联网将各种物理设备连接到互联网&#xff0c;使其能够感知环境、收集数据并与其他设备通信&#xff0c;而Web3技术则以去中心化、安全性和透明性为核心&am…

Linux开发板 FTP 服务器移植与搭建

VSFTPD&#xff08;Very Secure FTP Daemon&#xff09;是一个安全、稳定且快速的FTP服务器软件&#xff0c;广泛用于Unix和Linux操作系统。它以其轻量级、高效和易于配置而受到赞誉。VSFTPD不仅支持标准的FTP命令和操作&#xff0c;还提供了额外的安全特性&#xff0c;如匿名F…