当前位置: 首页 > 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…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...