贪心——股票买卖最大利润

题目要求:
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

本题核心是一次交易(先买后卖)求最大利润,关键在于:

  • 只能一次买入、一次卖出,且卖出必须在买入之后;
  • 目标是找到最低买入价和后续最高卖出价的最大差值;
  • 若价格持续下跌,返回0(不交易)。

最优解法(一次遍历,贪心)
思路:

  1. 维护两个变量:
  • minPrice:记录截至当前的历史最低价格(最佳买入点);
  • maxProfit:记录截至当前的最大利润。
  1. 遍历数组:
  • 若当前价格 < minPrice,更新minPrice;
  • 否则计算当前利润(当前价 - minPrice),更新maxProfit;
  1. 遍历结束返回maxProfit。

Java代码实现如下:

class Solution {
    public int maxProfit(int[] prices) {
        // 边界处理:数组为空或只有一天,无法交易
        if (prices == null || prices.length <= 1) {
            return 0;
        }
        int minPrice = prices[0]; // 初始化最低价格为第一天价格
        int maxProfit = 0;         // 初始化最大利润为0
        for (int i = 1; i < prices.length; i++) {
            // 更新历史最低价格
            if (prices[i] < minPrice) {
                minPrice = prices[i];
            } else {
                // 计算当前利润,更新最大利润
                maxProfit = Math.max(maxProfit, prices[i] - minPrice);
            }
        }
        return maxProfit;
    }
}

复杂度分析:

  • 时间复杂度:O(n),仅需一次遍历数组;
  • 空间复杂度:O(1),仅用常数变量,无额外空间。
posted @ 2026-05-14 10:49  ZealousMclaren  阅读(18)  评论(0)    收藏  举报