1. 题目描述
给你一个整数数组 nums
,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
2. 解题思路
对于这道题目,我们可以使用动态规划来解答。
我们只需要在遍历数组时,不断更新最大值即可,这个过程中,我们需要维护两个值:
- max,当前的最大值,将当前的值与当前的值和之前的最大值的乘积进行对比,保存最大值
- min,当前的最小值,将当前的值与当前的值和之前的最小值的乘积进行对比,保存最小值
我们这里求的是最大值,那为啥还要保存最小值呢?这是因为数组中可能会有负数,当当前的值是负数时,与之前的值相乘就会导致最大值和最小值交换,所以我们需要维护一个最大值和一个最小值。然后不断使用当前的最大值保存为结果,最后返回结果即可。
复杂度分析:
- 时间复杂度:O(n),我们需要遍历一遍数组,所以时间复杂度为O(n);
空间复杂度:O(1),这里我们需要的额外空间为常数级,所以空间复杂度为O(1)。
3. 代码实现
/**
* @param {number[]} nums
* @return {number}
*/
var maxProduct = function(nums) {
let res = -Infinity, max = 1, min = 1;
for(let i = 0; i < nums.length; i++){
if(nums[i] < 0){
let temp = max
max = min
min = temp
}
max = Math.max(nums[i], nums[i] * max)
min = Math.min(nums[i], nums[i] * min)
res = Math.max(res, max)
}
return res
};
4. 提交结果