面试经典算法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…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
