Leetcode--152. 乘积最大子序列
发布日期:2021-04-30 21:00:41 浏览次数:149 分类:精选文章

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

为了解决这个问题,我们需要找到一个整数数组中的连续子数组,使其乘积最大化。这个问题可以通过维护当前的最大值和最小值来解决,这在处理负数时尤为重要,因为负数会导致乘积的最大值和最小值交换。

方法思路

我们可以通过遍历数组,维护当前的最大值和最小值来解决这个问题。具体步骤如下:

  • 初始化:将当前的最大值和最小值都初始化为数组的第一个元素,同时将结果初始化为数组的第一个元素。
  • 遍历数组:从第二个元素开始遍历数组。
  • 更新最大值和最小值:对于每个元素,计算当前元素与之前最大值和最小值的乘积,分别作为新的临时最大值和临时最小值。然后,更新当前的最大值和最小值。
  • 更新结果:每次遍历后,更新全局的最大乘积结果。
  • 这种方法的时间复杂度为 O(n),其中 n 是数组的长度。空间复杂度为 O(1),因为我们只使用了常数额外的空间。

    解决代码

    public class Solution152 {    public static int maxProduct(int[] nums) {        if (nums.length == 0) {            return 0;        }        int max = nums[0];        int min = nums[0];        int result = nums[0];        for (int i = 1; i < nums.length; i++) {            int num = nums[i];            int tempMax = max * num;            int tempMin = min * num;            int currentMax = Math.max(tempMax, tempMin, num);            int currentMin = Math.min(tempMax, tempMin, num);            max = currentMax;            min = currentMin;            if (max > result) {                result = max;            }        }        return result;    }    public static void main(String[] args) {        int nums[] = { -5, -4, -3, -2 };        System.out.println(maxProduct(nums));    }}

    代码解释

  • 初始化maxmin 初始化为数组的第一个元素,result 同样初始化为第一个元素。
  • 遍历数组:从第二个元素开始遍历数组中的每个元素。
  • 计算临时最大值和最小值tempMax 是当前元素与 max 的乘积,tempMin 是当前元素与 min 的乘积。
  • 更新当前最大值和最小值:使用 Math.maxMath.min 来确定新的 maxmin
  • 更新结果:每次遍历后,检查当前的 max 是否大于 result,并更新 result
  • 这种方法确保了在每次遍历中,我们都能找到当前最大的乘积,并通过维护最大值和最小值来处理负数的情况,从而保证结果的正确性。

    上一篇:Spring源码分析(一)
    下一篇:解决spark standalone模式 以cluster模式提交时找不到jar包问题

    发表评论

    最新留言

    路过,博主的博客真漂亮。。
    [***.116.15.85]2026年06月10日 20时28分58秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章