当前位置: 首页 > news >正文

面试经典算法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) 算法的步骤:

  1. 初始化 min_price 为第一个元素,即第一天的股票价格。
  2. 初始化 max_profit 为 0。
  3. 从第二天开始遍历数组 prices
    • 对于每个价格 prices[i],计算如果今天卖出的利润:profit = prices[i] - min_price
    • 如果 profit 大于 max_profit,则更新 max_profit
    • 如果 prices[i] 小于 min_price,则更新 min_price
  4. 返回 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.maxMath.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 方法的一些关键点:

  1. 静态方法:由于 Math.max 是静态的,你可以直接使用 Math.max 来调用它,而不需要创建 Math 类的实例。

  2. 重载Math.max 有多个重载版本。最常见的两个是:

    • public static int max(int a, int b):返回 a 和 b 中的较大整数值。
    • public static double max(double a, double b):返回 a 和 b 中的较大双精度浮点数值。
  3. 数值类型:如果你使用 Math.max 比较不同类型的数值,比如整数和浮点数,整数将被隐式转换为浮点数。

  4. NaN 处理:如果传入 NaN(Not a Number),Math.max 将根据其重载版本返回另一个数值(对于 int 版本,返回另一个参数,因为整数不能表示 NaN),或者返回 NaN(对于 double 版本)。

  5. 使用示例

    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 方法的一些关键点:

  1. 静态方法:由于 Math.min 是静态的,你可以直接使用 Math.min 来调用它,而不需要创建 Math 类的实例。

  2. 重载版本

    • 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 中的较小双精度浮点数值。
  3. 数值类型Math.min 可以处理整数、长整数、单精度浮点数和双精度浮点数。如果你比较不同类型的数值,较小的数值将根据需要进行转换。

  4. NaN 处理:如果传入 NaN(Not a Number),Math.min 的行为取决于其重载版本:

    • 对于整数值比较,如果任一参数是 NaN,结果将为另一个参数的值,因为整数不能表示 NaN。
    • 对于浮点值比较,如果任一参数是 NaN,结果将是 NaN。
  5. 使用示例

    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 &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。 返回你可以从这笔交易…...

安装jdk和tomcat

安装nodejs 1.安装nodejs&#xff0c;这是一个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、使用两个线程完成两个文件的拷贝&#xff0c;分支线程1拷贝前一半&#xff0c;分支线程2拷贝后一半&#xff0c;主线程回收两个分支线程的资源 #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 在上一章中&#xff0c;我们主要介绍了文件类型…...

保证项目如期上线,测试人能做些什么?

要保证项目按照正常进度发布&#xff0c;需要整个研发团队齐心协力。 有很多原因都可能会造成项目延期。 1、产品经理频繁修改需求 2、开发团队存在技术难题 3、测试团队测不完 今天我想跟大家聊一下&#xff0c;测试团队如何保证项目按期上线&#xff0c;以及在这个过程中可能…...

【杂谈】在大学如何学得计算机知识,浅谈大一经验总结

大学新生的入门经验简谈 我想在学习编程这条路上&#xff0c;很多同学感到些许困惑&#xff0c;摸爬滚打一年&#xff0c;转眼就要进入大二学习了&#xff0c;下面浅谈个人经验与反思总结。倘若说你是迷茫的&#xff0c;希望这点经验对你有帮助&#xff1b;但倘若你有更好的建…...

Superset二次开发之柱状图实现同时显示百分比、原始值、汇总值的功能

背景 柱状图贡献模式选择行,堆积样式选择Stack,默认展示百分比,可以展示每个堆积的百分比,但是无法实现同时展示百分比、原始值、汇总值的效果。借助Tooltip可以实现,但是不直观。 柱状图来自Echarts插件,可以先考虑Echarts的柱状图如何实现此需求,再研究Superset项目的…...

堆的创建和说明

文章目录 目录 文章目录 前言 小堆&#xff1a; 大堆&#xff1a; 二、使用步骤 1.创建二叉树 2.修改为堆 3.向上调整 结果实现 总结 前言 我们已经知道了二叉树的样子&#xff0c;但是一般的二叉树是没有什么意义的&#xff0c;所以我们会使用一些特殊的二叉树来进行实现&a…...

【玩转python】入门篇day14-函数

1、函数的定义 函数通过def定义&#xff0c;包括函数名、参数、返回值 # 定义函数 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 // 自定义文件名&#xff0c;可根据需要修改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-输入日期,计算前后几天的日期

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

Zabbix 7.0 安装

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

软考高级-系统架构设计师

2024广东深圳考试时间 报考人员可登录中国计算机技术职业资格网&#xff08;http://www.ruankao.org.cn&#xff09;进行网上报名&#xff0c;报名前须扫码绑定个人微信&#xff0c;不允许代报名。 上半年考试报名信息填报时间&#xff1a;2024年3月25日9:00&#xff0d;4月2日…...

Notepad++ 安装 compare 插件

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

大数据技术原理-spark的安装

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

第四范式上线搜广推一体化平台 赋能企业高效增长

产品上新 Product Release 今天&#xff0c;第四范式产品再度上新&#xff0c;正式升级并推出的“搜广推”一体化平台——天枢。 天枢拥有全面的用户画像分析、端到端的搜索推荐一体化、一站式流量运营管理等能力&#xff0c;集合智能搜索、智能推荐和智能推广三大能力于一身&a…...

智能小程序 Ray 开发面板 SDK —— 智能设备模型通用能力一键执行 SDK 汇总(一)

getTapToRunRules 描述 查询当前家庭下可绑定的一键执行列表&#xff0c;会去掉失效或自动化规则。 请求参数 参数数据类型说明是否必填devIdstring设备 ID&#xff0c;默认从设备环境中取否gidstring家庭 ID&#xff0c;默认从当前家庭中取否containStandardZigBeeboolean…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...