返回

交易大师诀窍分享:LeetCode买股票秘籍,JavaScript版

前端

引言:算法的艺术

算法,是计算机科学的灵魂。它是一种解决问题的系统化方法,也是编程的基石。掌握算法,意味着掌握了计算机思维的核心,能够高效地解决复杂的问题。

算法题型解析:「买卖股票的最佳时机 IV」

题目

给定一个整数数组prices,其中prices[i]表示第i天股票的价格。给你一个整数k,表示你最多可以进行k笔交易。

示例1:

输入:prices = [2,4,1], k = 2
输出:2
解释:在第一天买入股票,在第二天卖出,在第三天买入股票,在第二天卖出。

示例2:

输入:prices = [3,2,6,5,0,3], k = 2
输出:7
解释:在第一天买入股票,在第二天卖出,在第三天买入股票,在第四天卖出,在第五天买入股票,在第六天卖出。

提示:

  • 0 <= k <= 100
  • 0 <= prices.length <= 100

动态规划:算法艺术的精髓

动态规划是一种解决问题的算法范式,它将复杂问题分解成一系列更小的子问题,然后逐个解决这些子问题,最终得到整个问题的解决方案。动态规划的思想来源于数学中的动态规划原理,该原理认为:一个最优解可以由其前面的子问题的最优解组成。

JavaScript算法实现:买卖股票的最佳时机

/**
 * 动态规划解决买卖股票的最佳时机IV问题
 * @param {number[]} prices 股票价格数组
 * @param {number} k 允许的交易次数
 * @return {number} 最大利润
 */
const maxProfit = (prices, k) => {
  // 特判:当k大于等于prices长度时,可以进行无限次交易
  if (k >= prices.length) {
    return maxProfit_no_limit(prices);
  }

  // 定义状态转移方程
  const dp = new Array(k + 1).fill(0).map(() => new Array(2).fill(0));

  // 初始化dp数组
  dp[0][0] = 0;
  dp[0][1] = -prices[0];

  // 遍历价格数组
  for (let i = 1; i < prices.length; i++) {
    // 对于每一天,计算持有股票和不持有股票的最大利润
    for (let j = 1; j <= k; j++) {
      dp[j][0] = Math.max(dp[j][0], dp[j - 1][1] + prices[i]);
      dp[j][1] = Math.max(dp[j][1], dp[j - 1][0] - prices[i]);
    }
  }

  // 返回最后一天持有股票的最大利润
  return dp[k][0];
};

/**
 * 计算无限次交易的最大利润
 * @param {number[]} prices 股票价格数组
 * @return {number} 最大利润
 */
const maxProfit_no_limit = (prices) => {
  let profit = 0;
  for (let i = 1; i < prices.length; i++) {
    if (prices[i] > prices[i - 1]) {
      profit += prices[i] - prices[i - 1];
    }
  }
  return profit;
};

文章总结:算法的魅力

通过LeetCode算法题,「买卖股票的最佳时机 IV」,我们学习了动态规划这一算法范式,并用JavaScript实现了该算法。算法的魅力在于,它能够将复杂的问题分解成一系列更小的子问题,然后逐个解决这些子问题,最终得到整个问题的解决方案。掌握算法,意味着掌握了计算机思维的核心,能够高效地解决复杂的问题。