学习记录:js算法(七十一): 买卖股票的最佳时机

server/2024/10/22 15:55:33/

文章目录

    • 买卖股票的最佳时机
      • 思路一
      • 思路二

买卖股票的最佳时机

给定一个数组 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

思路一

function maxProfit(prices) {let minPrice = prices[0]; // 初始化最低价格为第一天的价格let maxProfit = 0; // 初始化最大利润为0// 从第二天开始遍历,因为第一天无法卖出for (let i = 1; i < prices.length; i++) {// 更新最低价格minPrice = Math.min(minPrice, prices[i]);// 计算当前价格卖出的利润,并尝试更新最大利润const potentialProfit = prices[i] - minPrice;maxProfit = Math.max(maxProfit, potentialProfit);}return maxProfit;
}

讲解
这道题目的关键在于找到股票价格的最低点和之后的最高点,因为买卖之间的差价即为利润。我们可以通过一次遍历来解决这个问题,维护两个变量:一个是遍历至今的最低价格 minPrice ,另一个是当前能获得的最大利润 maxProfit

  1. 初始化变量:初始化 minPrice 为数组的第一个元素,因为我们要找的是遍历过程中的最低点,同时初始化 maxProfit0 ,表示初始没有利润。
  2. 遍历数组:从数组的第二个元素开始遍历,因为我们需要至少两天的数据来计算利润(买入和卖出日)。
  3. 更新最低价格:在遍历过程中,如果遇到比当前 minPrice 更低的价格,就更新 minPrice 。这是因为我们希望在最低点买入股票,以最大化利润。
  4. 计算潜在利润并更新最大利润:对于遍历到的每个价格,计算以当前价格卖出可以获得的利润,即 price - minPrice 。如果这个利润大于当前的 maxProfit ,就更新 maxProfit
  5. 遍历结束后返回结果:遍历完整个数组后,maxProfit 就是可以获取的最大利润。

思路二

function maxProfit(prices) {let minPrice = Infinity; // 初始化为无穷大let maxProfit = 0; // 初始化最大利润为0for (let price of prices) {// 更新最低价格if (price < minPrice) {minPrice = price;}// 计算当前利润并更新最大利润let currentProfit = price - minPrice;if (currentProfit > maxProfit) {maxProfit = currentProfit;}}return maxProfit; // 返回最大利润
}

讲解

  1. 初始化:设置一个变量 minPrice 来记录到当前天为止的最低价格,初始值为 Infinity。同时,设置一个变量 maxProfit 来记录最大利润,初始值为 0
  2. 遍历价格数组:
    对于每一天的价格,更新 minPrice 为当前价格和 minPrice 的较小值。
    计算当前价格减去 minPrice 的差值,更新 maxProfit 为两者的较大值。
  3. 返回结果:遍历结束后,maxProfit 就是我们能获得的最大利润。

http://www.ppmy.cn/server/133944.html

相关文章

HarmonyOS NEXT:ArkTS实现九九乘法表

@Entry @Component struct Index {//九九乘法表for循环逻辑muTable(){let result:string[][] = []for(let i = 1;i<=9;i++){let index:string[] = []for (let j = 1; j <= i; j++) {let temp = j + * + i + = + i*jindex.push(temp)}result.push(index)}return result}bu…

Java语言-接口(上)

目录 1.接口的概念 2.语法规则 3.接口使用 4.接口特性 5.实现多个接口 6.接口间的继承 1.接口的概念 在现实生活中&#xff0c;接口的例子比比皆是&#xff0c;比如&#xff1a;笔记本上的USB口&#xff0c;电源插座等。 电脑的 USB 口上&#xff0c;可以插&#xff1…

路由器概述

一、路由器的工作原理 根据路由表转发数据 二、路由表与其形成 2.1路由表 &#xff08;1&#xff09;概念 路由&#xff1a;从源主机到目的主机的转发过程路由表&#xff1a;路由器中维护的路由条目的集合&#xff1b;路由器根据路由表做路径选择 &#xff08;2&#xff…

vb操作文件夹多电子表格 添加数据到数据库

Private Sub 批量文件夹导入_Click() If MsgBox(" 1程序文件夹内必须有 五险一金 文件夹. 2五险一金里面表格名称开头前六位格式必须是 202401 202512 的日期格式 3表格里面字段名称必须和数据库字段相同 4必须是 A列工号 B列姓名 D列身份证 …顺序 &#xff01; 5程序启…

laravel清除不同缓存

1、清除应用程序缓存&#xff1a; php artisan cache:clear2、清除路由缓存&#xff1a; php artisan route:cache3、清除配置缓存&#xff1a; php artisan config:cache4、清除编译后的视图文件&#xff1a; php artisan view:clear5、清除事件和监听器缓存&#xff1a; ph…

「Qt Widget中文示例指南」如何实现一个平板电脑示例?(二)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 当您在平板电脑上使用…

Win安装Redis

目录 1、下载 2、解压文件并修改名称 3、前台简单启动 4、将redis设置成服务后台启动 5、命令启停redis 6、配置文件设置 1、下载 【下载地址】 2、解压文件并修改名称 3、前台简单启动 redis-server.exe redis.windows.conf 4、将redis设置成服务后台启动 redis-server -…

MedSAM微调版,自动生成 Prompt 嵌入实现图像分割!

最近提出的Segment Anything Model (SAM)等基础模型在图像分割任务上取得了显著的成果。 然而&#xff0c;这些模型通常需要通过人工设计的 Prompt &#xff08;如边界框&#xff09;进行用户交互&#xff0c;这限制了它们的部署到下游任务。 将这些模型适应到具有完全 Token 数…