买卖股票的最佳时机--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;
}