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的数组,例如:
-
此时我们可以注意到 是选择 -2, -5 还是 -5, -6 呢?
-
既然程序 从前往后 一次循环无法判断,那么就再执行一次 从后往前 循环。
-
就可以得到结果了
写 贪心类 的题,主要在于思路,这样效率也很高。
贪心
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 :对于 贪心 类的题,要多考虑,多尝试才有结果。