返回

独辟蹊径谈“买卖股票的最佳时机”:用代码详解动态规划

前端

众所周知,把握时机对股票交易至关重要。想在股票市场上立足,我们不仅需要敏锐的洞察力,更需要掌握科学的方法。

今天,我们就把目光投向 LeetCode 经典题目:“买卖股票的最佳时机”。这道题旨在考验我们的动态规划能力,帮助我们用代码找到买入和卖出股票的最佳时机,从而最大化利润。

一、题目背景

给定一个数组 prices,其中 prices[i] 表示股票在第 i 天的价格。我们需要找到买入和卖出股票的最佳时机,使得利润最大化。注意,只能进行一次买入和卖出操作。

二、动态规划解析

这个问题的动态规划解法可以用一个一维数组 dp 来解决。其中,dp[i] 表示在第 i 天(包括第 i 天)之前,股票的最大利润。

我们从 dp[0] = 0 开始,然后依次计算每个 dp[i]。对于 dp[i],我们有两种选择:

  • 不持有股票: 在这种情况下,dp[i] = dp[i-1]。
  • 持有股票: 在这种情况下,dp[i] = max(dp[i-1], -prices[i] + max(dp[0], dp[1], ..., dp[i-1])。

三、代码实现

class Solution {
    public int maxProfit(int[] prices) {
        if (prices == null || prices.length <= 1) {
            return 0;
        }

        int[] dp = new int[prices.length];
        dp[0] = 0;

        for (int i = 1; i < prices.length; i++) {
            dp[i] = Math.max(dp[i-1], -prices[i] + findMax(dp, 0, i-1));
        }

        return dp[prices.length - 1];
    }

    private int findMax(int[] dp, int start, int end) {
        int max = Integer.MIN_VALUE;
        for (int i = start; i <= end; i++) {
            max = Math.max(max, dp[i]);
        }

        return max;
    }
}

四、总结

动态规划是一种强大的技术,可以帮助我们解决各种问题。通过将问题分解成子问题,我们能够逐步找到最优解。在“买卖股票的最佳时机”这道题中,我们使用动态规划巧妙地解决了这一难题,找到了最佳的买入和卖出时机。