开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
题目
给你一个整数数组
nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
思路
我们先声明变量length,默认值为nums数组的长度,然后再声明maxF变量和minF变量以及multiply变量,maxF变量的值和minF变量的值以及multiply变量的值默认都为nums数组的第一个值,不同的是maxF变量存储着最大子数组,minF变量存储着最小子数组,multiply变量存储最大连续子数组的乘积,我们在使用for循环进行遍历,我们从nums数组的第二个值开始,在循环中我们新建max变量和min变量,max变量的值和min变量的值分别是maxF变量和minF变量,这两个变量是将最大子数组和最小子数组复制过来,然后使用Math.max方法获取到最大连续子数组值,这里可能没有之前的数组值,但是一定要包含当前循环的数组值,将获取到的最大连续子数组值赋值给maxF变量,在使用Math.min方法获取到最小连续子数组值,因为有可能会出现负值的情况,不过负负得正,最小值也会成为最大值,我们将获取到的值赋值给minF变量,然后再使用Math.max方法在multiply变量和maxF变量取出最大值赋值给multiply变量,更新下最大连续子数组的乘积,循环结束后,我们将存储最大连续子数组的乘积multiply变量返回出去
/**
* @param {number[]} nums
* @return {number}
*/
var maxProduct = function(nums) {
let length = nums.length;
let maxF = nums[0];
let minF = nums[0];
let multiply = nums[0];
for(let i=1; i<length; i++){
let max = maxF;
let min = minF;
maxF = Math.max(max * nums[i], Math.max(nums[i], min * nums[i]));
minF = Math.min(min * nums[i], Math.min(nums[i], max * nums[i]));
multiply = Math.max(multiply, maxF);
}
return multiply;
};