LC-152. 乘积最大子数组

131 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目描述

给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。

测试用例的答案是一个 32-位 整数。

子数组 是数组的连续子序列。

示例 1:

输入: nums = [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。

示例 2:

输入: nums = [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。

提示:

  • 1 <= nums.length <= 2 * 104
  • -10 <= nums[i] <= 10
  • nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数

题解

这道题和上面 LC-53. 最大子数组和 很相似,所以还是可以通过贪心 的方式来解决。

解题思路:

  • 首先每次遇到0将是新一轮的乘积。

  • 抛开元素为0的值,我们可以获得一段无0的数组,例如:

    image.png

  • 此时我们可以注意到 是选择 -2, -5 还是 -5, -6 呢?

  • 既然程序 从前往后 一次循环无法判断,那么就再执行一次 从后往前 循环。

  • 就可以得到结果了

写 贪心类 的题,主要在于思路,这样效率也很高。

image.png

贪心

const maxProduct = (nums) => {
  const numsLength = nums.length

  let max = nums[0]
  let temporary = 1

  for (let i = 0; i < numsLength; i++) {
    const val = nums[i]

    temporary = temporary * val
    max = Math.max(temporary, max)

    if (val === 0) temporary = 1
  }

  temporary = 1

  for (let i = numsLength - 1; i >= 0; i--) {
    const val = nums[i]

    temporary = temporary * val
    max = Math.max(temporary, max)

    if (val === 0) temporary = 1
  }

  return max
}

总结

题目 34 :对于 贪心 类的题,要多考虑,多尝试才有结果。