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

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...