面试经典算法150题系列-数组/字符串操作之买卖股票最佳时机
买卖股票最佳时机
给定一个数组 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。
实现思路:
从左到右遍历数组,同时维护一个最小买入价格 min_price
和计算到目前为止的最大利润 max_profit
。
以下是 O(n) 算法的步骤:
- 初始化
min_price
为第一个元素,即第一天的股票价格。 - 初始化
max_profit
为 0。 - 从第二天开始遍历数组
prices
:- 对于每个价格
prices[i]
,计算如果今天卖出的利润:profit = prices[i] - min_price
。 - 如果
profit
大于max_profit
,则更新max_profit
。 - 如果
prices[i]
小于min_price
,则更新min_price
。
- 对于每个价格
- 返回
max_profit
。
实现代码:
public int maxProfit(int[] prices) {// 如果数组为空或者只有一个价格点,无法进行交易,因此返回0if (prices == null || prices.length <= 1) {return 0;}// 初始化买入价格为数组的第一个价格点int minPrice = prices[0];// 初始化最大利润为0int maxProfit = 0;// 从数组的第二天价格开始遍历(索引1)for (int i = 1; i < prices.length; i++) {// 计算如果在今天卖出能够得到的利润int profit = prices[i] - minPrice;// 如果今天卖出的利润大于之前记录的最大利润,则更新最大利润if (profit > maxProfit) {maxProfit = profit;}// 如果今天的价格比之前的最小买入价格还要低,更新最小买入价格if (prices[i] < minPrice) {minPrice = prices[i];}}// 返回计算出的最大利润return maxProfit;
}
上述代码可以进行简短的优化,保持代码的简洁,我们可以使用Math.max和Math.min两个库函数代替if语句。
实现代码二:
public int maxProfit(int[] prices) {// 初始化结果变量 res 为 0,这将用来累积计算得到的最大利润。int res = 0; // 初始化买入价格 minBuy 为数组的第一个元素,即假设第一天买入。int minBuy = prices[0];// 从数组的第二个元素开始遍历(索引从1开始),因为我们已经用第一个元素初始化了 minBuy。for(int i = 1; i < prices.length; i++){// 计算当前价格与最小买入价格的差值,即如果今天卖出能得到的利润。// 使用 Math.max 函数更新 res,使其始终保持最大的利润值。res = Math.max(res, prices[i] - minBuy);// 更新 minBuy,使其始终保持迄今为止遇到的最小价格。// 如果当前价格更低,说明这是一个更好的买入点。minBuy = Math.min(minBuy, prices[i]);}// 遍历完成后,返回累计的最大利润。return res;}
知识补充(不了解上述两个函数有兴趣的人可以看看):
1.Math.max
Math.max
是 Java 中的一个静态方法,属于 java.lang.Math
类。这个方法用于返回两个给定数值中的最大值。如果其中一个数值是浮点数,另一个是整数,那么整数将被转换为浮点数然后再进行比较。
以下是 Math.max
方法的一些关键点:
-
静态方法:由于
Math.max
是静态的,你可以直接使用Math.max
来调用它,而不需要创建Math
类的实例。 -
重载:
Math.max
有多个重载版本。最常见的两个是:public static int max(int a, int b)
:返回a
和b
中的较大整数值。public static double max(double a, double b)
:返回a
和b
中的较大双精度浮点数值。
-
数值类型:如果你使用
Math.max
比较不同类型的数值,比如整数和浮点数,整数将被隐式转换为浮点数。 -
NaN 处理:如果传入
NaN
(Not a Number),Math.max
将根据其重载版本返回另一个数值(对于int
版本,返回另一个参数,因为整数不能表示 NaN),或者返回 NaN(对于double
版本)。 -
使用示例:
int maxInt = Math.max(5, 10); // 返回 10 double maxDouble = Math.max(3.14, 2.71); // 返回 3.14
在股票交易利润最大化问题中,Math.max
被用来更新到目前为止计算出的最大利润。每次循环中,我们使用 Math.max(res, prices[i] - minBuy)
来确定是保持当前的最大利润 res
还是更新为当前价格与最小买入价格差值的新利润。这确保了 res
始终保存了遍历过程中的最大利润值。
2.Math.min
以下是 Math.min
方法的一些关键点:
-
静态方法:由于
Math.min
是静态的,你可以直接使用Math.min
来调用它,而不需要创建Math
类的实例。 -
重载版本:
public static int min(int a, int b)
:返回a
和b
中的较小整数值。public static long min(long a, long b)
:返回a
和b
中的较小长整数值。public static float min(float a, float b)
:返回a
和b
中的较小单精度浮点数值。public static double min(double a, double b)
:返回a
和b
中的较小双精度浮点数值。
-
数值类型:
Math.min
可以处理整数、长整数、单精度浮点数和双精度浮点数。如果你比较不同类型的数值,较小的数值将根据需要进行转换。 -
NaN 处理:如果传入
NaN
(Not a Number),Math.min
的行为取决于其重载版本:- 对于整数值比较,如果任一参数是
NaN
,结果将为另一个参数的值,因为整数不能表示 NaN。 - 对于浮点值比较,如果任一参数是 NaN,结果将是 NaN。
- 对于整数值比较,如果任一参数是
-
使用示例:
int minInt = Math.min(5, 10); // 返回 5 double minDouble = Math.min(3.14, 2.71); // 返回 2.71
在之前提到的股票交易利润最大化问题中,
Math.min
被用来在循环中更新到目前为止遇到的最小股票价格。这样,我们可以确保在任何给定的日子卖出股票时,都能计算出以之前最低价格买入的最大利润。这是通过在循环体内使用minBuy = Math.min(minBuy, prices[i]);
来实现的,其中minBuy
变量始终保持着迄今为止的最小买入价格。
相关文章:
面试经典算法150题系列-数组/字符串操作之买卖股票最佳时机
买卖股票最佳时机 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…...

安装jdk和tomcat
安装nodejs 1.安装nodejs,这是一个jdk一样的软件运行环境 yum -y list installed|grep epel yum -y install nodejs node -v 2.下载对应的nodejs软件npm yum -y install npm npm -v npm set config .....淘宝镜像 3.安装vue/cli command line interface 命令行接…...
mongodb 备份还原
### 加入 MongoDB 官方 repositoryecho [mongodb-org-4.4] nameMongoDB Repository baseurlhttps://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.4/x86_64/ gpgcheck1 enabled1 gpgkeyhttps://www.mongodb.org/static/pgp/server-4.4.asc| tee /etc/yum.repos.d/mo…...

day27——homework
1、使用两个线程完成两个文件的拷贝,分支线程1拷贝前一半,分支线程2拷贝后一半,主线程回收两个分支线程的资源 #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <fcntl.h> #include <uni…...

shell脚本自动化部署
1、自动化部署DNS [rootweb ~]# vim dns.sh [roottomcat ~]# yum -y install bind-utils [roottomcat ~]# echo "nameserver 192.168.8.132" > /etc/resolv.conf [roottomcat ~]# nslookup www.a.com 2、自动化部署rsync [rootweb ~]# vim rsync.sh [rootweb ~]# …...

C语言| 文件操作详解(二)
目录 四、有关文件的随机读写函数 4.1 fseek 4.2 ftell 4.3 rewind 五、判定文件读取结束的标准与读写文件中途发生错误的解决办法 5.1 判定文件读取结束的标准 5.2 函数ferror与feof 5.2.1 函数ferror 5.2.2 函数feof 在上一章中,我们主要介绍了文件类型…...

保证项目如期上线,测试人能做些什么?
要保证项目按照正常进度发布,需要整个研发团队齐心协力。 有很多原因都可能会造成项目延期。 1、产品经理频繁修改需求 2、开发团队存在技术难题 3、测试团队测不完 今天我想跟大家聊一下,测试团队如何保证项目按期上线,以及在这个过程中可能…...
【杂谈】在大学如何学得计算机知识,浅谈大一经验总结
大学新生的入门经验简谈 我想在学习编程这条路上,很多同学感到些许困惑,摸爬滚打一年,转眼就要进入大二学习了,下面浅谈个人经验与反思总结。倘若说你是迷茫的,希望这点经验对你有帮助;但倘若你有更好的建…...
Superset二次开发之柱状图实现同时显示百分比、原始值、汇总值的功能
背景 柱状图贡献模式选择行,堆积样式选择Stack,默认展示百分比,可以展示每个堆积的百分比,但是无法实现同时展示百分比、原始值、汇总值的效果。借助Tooltip可以实现,但是不直观。 柱状图来自Echarts插件,可以先考虑Echarts的柱状图如何实现此需求,再研究Superset项目的…...

堆的创建和说明
文章目录 目录 文章目录 前言 小堆: 大堆: 二、使用步骤 1.创建二叉树 2.修改为堆 3.向上调整 结果实现 总结 前言 我们已经知道了二叉树的样子,但是一般的二叉树是没有什么意义的,所以我们会使用一些特殊的二叉树来进行实现&a…...
【玩转python】入门篇day14-函数
1、函数的定义 函数通过def定义,包括函数名、参数、返回值 # 定义函数 def test(a,b): # a,b表示形式参数print(a b)#函数体(具体的功能)return a*b #返回值# 函数调用 test(12,43) # 12和43表示实际参数,在调用函数时,会替换形式参数a,b下面这个展示了稍微复…...
uni-app 将base64图片转换成临时地址
function getTempFilePath(base64Data) {return new Promise((resolve, reject) > {const fs uni.getFileSystemManager()base64Data base64Data.split(,)[1]const fileName temp_image_ Date.now() .png // 自定义文件名,可根据需要修改const filePath un…...

C#用Socket实现TCP客户端
1、TCP客户端实现代码 using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; using System.Threading.Tasks;namespace PtLib.TcpClient {public delegate void Tcp…...

jmeter-beanshell学习15-输入日期,计算前后几天的日期
又遇到新问题了,想要根据获取的日期,计算出前面两天的日期。网上找了半天,全都是写获取当天日期,然后计算昨天的日期,照葫芦画瓢也没改出来想要的,最后求助了开发同学。 先放上网上获取当天,计…...

Zabbix 7.0 安装
在zabbix官网中有着比较完善的安装步骤,针对不同的系统都有。可以直接按照举例说明进行安装。本文只是针对其提供的安装步骤进行一些说明解释补充。 安装环境 操作系统版本:AlmaLinux 9.4(10.10.20.200)zabbix版本:7.…...

软考高级-系统架构设计师
2024广东深圳考试时间 报考人员可登录中国计算机技术职业资格网(http://www.ruankao.org.cn)进行网上报名,报名前须扫码绑定个人微信,不允许代报名。 上半年考试报名信息填报时间:2024年3月25日9:00-4月2日…...

Notepad++ 安装 compare 插件
文章目录 文章介绍对比效果安装过程参考链接 文章介绍 compare 插件用于对比文本差异 对比效果 安装过程 搜索compare插件 参考链接 添加链接描述...

大数据技术原理-spark的安装
摘要 本实验报告详细记录了在"大数据技术原理"课程中进行的Spark安装与应用实验。实验环境包括Spark、Hadoop和Java。实验内容涵盖了Spark的安装、配置、启动,以及使用Spark进行基本的数据操作,如读取本地文件、文件内容计数、模式匹配和行数…...

第四范式上线搜广推一体化平台 赋能企业高效增长
产品上新 Product Release 今天,第四范式产品再度上新,正式升级并推出的“搜广推”一体化平台——天枢。 天枢拥有全面的用户画像分析、端到端的搜索推荐一体化、一站式流量运营管理等能力,集合智能搜索、智能推荐和智能推广三大能力于一身&a…...
智能小程序 Ray 开发面板 SDK —— 智能设备模型通用能力一键执行 SDK 汇总(一)
getTapToRunRules 描述 查询当前家庭下可绑定的一键执行列表,会去掉失效或自动化规则。 请求参数 参数数据类型说明是否必填devIdstring设备 ID,默认从设备环境中取否gidstring家庭 ID,默认从当前家庭中取否containStandardZigBeeboolean…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...