题目
给你一个整数数组
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; };