每日一题 -- leetCode152

137 阅读2分钟

image.png 「这是我参与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
};

总结

无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。