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

买卖股票的最佳时机--js 算法

一、买卖股票的最佳时机

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 ;

贪心算法:
每次发现更低价格立即更新买入点(minPrice)
每次发现更高利润立即更新卖出收益(maxProfit)

/*** 计算股票买卖的最大利润(单次交易)* @param {number[]} prices - 股票每日价格数组* @returns {number} 最大利润(无利润时返回0)*/
function maxProfit(prices) {// 边界条件const len = prices.length || 0;if (len < 2) return 0;// 初始化历史最低价为第一天值let minPrice = prices[0];// 初始化最大利润为0(默认无利润)let maxProfit = 0;// 单次遍历所有价格点(从第二天开始)for (let i = 1; i < len; i++) {const currentPrice = prices[i];// 情况1:发现新的历史最低价if (currentPrice < minPrice) {minPrice = currentPrice; // 更新历史最低价// 情况2:当前价格高于历史最低价,计算潜在利润} else if (currentPrice - minPrice > maxProfit) {// 若当前利润超过历史最大利润则更新maxProfit = currentPrice - minPrice;}/* 注意:无需处理其他情况(如当前利润小于历史最大利润)因为此时只需维持已有的maxProfit值即可 */}// 返回整个遍历过程中发现的最大利润return maxProfit;
}

算法说明:
核心思路:单次遍历数组,动态追踪历史最低价,并计算当前价格与历史最低价的差值(潜在利润)
关键变量
minPrice:记录遍历过程中遇到的最低价格(初始设为最大安全整数)
maxProfit:记录当前最大利润(初始为0)
遍历过程
遇到更低价格时更新 minPrice
遇到更高价格时计算利润,并更新 maxProfit
边界处理:若所有价格递减(无利润),直接返回初始值0。

复杂度分析
时间复杂度 O(n):仅需遍历数组一次
空间复杂度 O(1):仅使用两个常量变量

二、买卖股票的最佳时机Ⅱ

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。返回 你能获得的 最大 利润 。

贪心算法:
捕捉所有上涨波段

/*** 计算股票买卖的最大利润(单次交易)* @param {number[]} prices - 股票每日价格数组* @returns {number} 最大利润(无利润时返回0)*/
function maxProfit(prices) { const len = prices.length || 0;if (len < 2) return 0;let maxProfit = 0;// 遍历从第二天开始的所有价格for (let i = 1; i < len; i++) {const curPrice = prices[i]; // 第i天价格const prePrice = prices[i-1]; // 第i-1天价格if (curPrice > prePrice) maxProfit += (curPrice - prePrice);};return maxProfit;
}
http://www.lryc.cn/news/578943.html

相关文章:

  • Nginx、Spring Cloud Gateway 与 Higress 的应用场景及核心区别
  • 从0到1:我的飞算JavaAI实战之旅,效率飙升10倍不是梦!
  • 【Rancher Server + Kubernets】- Nginx-ingress日志持久化至宿主机
  • uniapp项目中node_modules\sass\sass.dart.js的体积过大怎么处理
  • LeetCode[617]合并二叉树
  • 音频调试经验总结
  • 单链表和双向链表
  • Knife4j+Axios+Redis:前后端分离架构下的 API 管理与会话方案
  • 将文件使用base64存入数据库并在微信小程序中实现文件下载
  • 修复手机液晶面板显性横向线性不良定位及相关液晶线路激光修复原理
  • 【安全工具】SQLMap 使用详解:从基础到高级技巧
  • 【深度学习机器学习】Epoch 在深度学习实战中的合理设置指南
  • cmake find_package
  • Minio安装配置,桶权限设置,nginx代理 https minio
  • JAVA学习-练习试用Java实现“人脸识别:使用OpenCV+Java实现人脸检测与识别”
  • 【论文阅读】DeepEyes: Incentivizing “Thinking with Images” via Reinforcement Learning
  • STM32之光敏电阻传感器模块
  • uniapp 滚动tab
  • WPF控件大全:核心属性详解
  • Android-EDLA 解决 GtsMediaRouterTestCases 存在 fail
  • 移动公司Linux运维工程师招聘笔试题
  • 深入解析外观模式(Facade Pattern):简化复杂系统的优雅设计
  • STM32F103RET6 介绍
  • 机器学习:集成学习方法之随机森林(Random Forest)
  • 基于多种机器学习的江苏省二手房价格预测系统的设计与实现【城市全国可换】
  • 【QT】ROS2 Humble联合使用QT教程
  • Qt designer坑-布局内子控件的顺序错乱
  • ABAP+记录一个BDC的BUG修改过程
  • transformers==4.42.0会有一个BUG
  • pdf 合并 python实现(已解决)