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)); }} 代码解释
max 和 min 初始化为数组的第一个元素,result 同样初始化为第一个元素。tempMax 是当前元素与 max 的乘积,tempMin 是当前元素与 min 的乘积。Math.max 和 Math.min 来确定新的 max 和 min。max 是否大于 result,并更新 result。这种方法确保了在每次遍历中,我们都能找到当前最大的乘积,并通过维护最大值和最小值来处理负数的情况,从而保证结果的正确性。
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2026年06月10日 20时28分58秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!