一、買賣股票的最佳時機
給定一個數組 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;
}