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

发布于:2025-07-03 ⋅ 阅读:(13) ⋅ 点赞:(0)

一、买卖股票的最佳时机

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

网站公告

今日签到

点亮在社区的每一天
去签到