外观
乘积最大子数组
⭐ 题目日期:
小米 - 2024/10/18
🌳 题目描述:
给你一个整数数组 nums
,请你找出数组中乘积最大的非空连续 子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个 32-位 整数。
示例 1:
输入: nums = [2,3,-2,4]
输出: 6 解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
🧗难度系数:
⭐️ ⭐️ ⭐️
📝思路分析:
如果给定的数组只有正数,最大乘积为数组中所有数相乘。 但是由于负数的存在,乘积最大的子数组可能由负数构成。当负数与负数相乘时,会产生正数,这可能成为新的最大乘积。所以我们需要两个变量 max
和 min
来分别记录当前位置可能得到的最大乘积和最小乘积。累积的最大最小值需要跟当前数组中的元素对比,因为最终的结果可能是从当前的元素开始的。
💻代码:
Java
public int maxProduct(int[] nums) {
if (nums == null || 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];
if (num < 0) {
int temp = max;
max = min;
min = temp;
}
max = Math.max(num, max * num);
min = Math.min(num, min * num);
result = Math.max(result, max);
}
return result;
}
🚵🏻复杂度分析:
时间复杂度:O(n), 遍历数组一遍
空间复杂度:O(1), 仅用了几个常量