「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」
前言
每日一题,轻松解题
每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。
正文
:乘积最大子数组
难度:中等
题目要求:
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
举个例子
输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
:解题
方法一 :
理清思路:
将数字拆分成三种情况来看,要么是正数,要么是负数,要么是 0。
如果第 k 个数字为正数,包含这个数字的最大乘积的连续子数组可能是它本身(前面的连续最大乘积为负数或0),也可能是前面的最大乘积乘以它(前面的连续最大乘积大于0)
如果第 k 个数字为负数,包含这个数字的最大乘积的连续子数组可能是它本身(前面的连续最大乘积为负数且比它还小),也可能是前面的最小乘积乘以它(前面的连续最小乘积小于0)
而如果第 k 个数字为 0,那么最大连续子数组就在这里中断了,重新计数。
编辑代码:
var maxProduct = function(nums) {
let maximum = nums[0]
let minimum = nums[0]
let ans = maximum
for (let i = 1; i < nums.length; i ++) {
let tMax = maximum === 0 ? 1 : maximum
let tMin = minimum === 0 ? 1 : minimum
if (nums[i] > 0) {
[maximum, minimum] = [
Math.max(tMax * nums[i], nums[i]),
Math.min(tMin * nums[i], nums[i])
]
} else if (nums[i] < 0) {
[maximum, minimum] = [
Math.max(tMin * nums[i], nums[i]),
Math.min(tMax * nums[i], nums[i])
]
} else {
maximum = 0
minimum = 0
}
ans = Math.max(ans, maximum)
}
return ans
};
总结
无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。