剑指 Offer 63. 股票的最大利润——动态规划
发布日期:2021-05-07 21:20:11 浏览次数:16 分类:精选文章

本文共 1049 字,大约阅读时间需要 3 分钟。

要解决这个问题,我们需要找到一种高效的方法来计算买卖股票一次能获得的最大利润。直接暴力法虽然能解决问题,但时间复杂度太高,因此我们需要一种更优化的算法。

优化思路

我们可以通过以下步骤来优化问题:

  • 初始化变量:我们需要两个变量,一个记录当前的最低价格 min,另一个记录最大利润 maxProfit。初始时,min 可以设为数组的第一个元素,maxProfit 初始设为0。

  • 遍历数组:从数组的第二个元素开始遍历。对于每个元素:

    • 如果当前元素的价格低于 min,更新 min
    • 否则,计算当前元素价格与 min 的差值(即利润),并与 maxProfit 比较,更新 maxProfit
  • 处理边界情况:如果数组只有一个元素或者所有元素都是递减的,利润为0,这种情况会自动处理。

  • 这种方法的时间复杂度是 O(n),其中 n 是数组的长度,效率非常高。

    代码实现

    以下是基于上述思路的代码实现:

    public class Solution {    public int maxProfit(int prices[]) {        if (prices.length == 0) {            return 0;        }        int min = prices[0];        int maxProfit = 0;        for (int i = 1; i < prices.length; i++) {            if (prices[i] < min) {                min = prices[i];            } else if (prices[i] - min > maxProfit) {                maxProfit = prices[i] - min;            }        }        return maxProfit;    }}

    解释

    • 初始化变量min 初始化为数组的第一个元素,maxProfit 初始化为0。
    • 遍历数组:从第二个元素开始,逐个检查每个元素是否低于当前的 min,如果是,则更新 min。如果不是,计算当前元素与 min 的差值,并与 maxProfit 比较,更新较大的那个值。
    • 返回结果:遍历结束后,maxProfit 就是最大利润。

    这种方法确保我们只遍历了一次数组,时间复杂度为 O(n),非常高效,适用于大数组。

    上一篇:Leetcode - 2. 两数相加——链表
    下一篇:剑指 Offer 65. 不用加减乘除做加法——位运算

    发表评论

    最新留言

    很好
    [***.229.124.182]2025年03月28日 15时30分01秒