leetcode-乘积最大子数组

📅 发布时间:2026/7/12 4:06:54 👁️ 浏览次数:
leetcode-乘积最大子数组
给你一个整数数组 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] 10nums 的任何子数组的乘积都 保证 是一个 32-位 整数思路假设一个非空连续子数组序列1,2,3,…,k。该序列由k个数组成。该数组序列乘积最大。对于第k个数该问题中可能为正数也可能为负数。如果k为正数那么非空连续子数组序列1,2,3,…,k-1为正数。如果k为负数那么非空连续子数组序列1,2,3,…,k-1为负数。设数组中下标为i的数是非空连续子数组序列的第k个数。那么nums[i]要么是nums[i-1]为结尾的连续子数组序列的后一个数要么nums[i]是连续子数组序列的第一个数。分两种情况如果nums[i]0最大的乘积maxPos[i] Max(maxPos[i-1]*nums[i],nums[i]);如果nums[i]0最大的乘积maxPos[i] Max(minPos[i-1]*nums[i],nums[i]);期间还需要维护最小的乘积同样分两种情况。如果nums[i]0最小的乘积minPos[i] Max(minPos[i-1]*nums[i],nums[i]);如果nums[i]0最小的乘积minPos[i] Max(maxPos[i-1]*nums[i],nums[i]);代码class Solution{publicintmaxProduct(int[]nums){int[]maxNumsnewint[nums.length];int[]minNumsnewint[nums.length];intresnums[0];maxNums[0]nums[0];minNums[0]nums[0];for(inti1;inums.length;i){if(nums[i]0){maxNums[i]Math.max(nums[i],nums[i]*maxNums[i-1]);minNums[i]Math.min(nums[i],nums[i]*minNums[i-1]);}else{maxNums[i]Math.max(nums[i],nums[i]*minNums[i-1]);minNums[i]Math.min(nums[i],nums[i]*maxNums[i-1]);}resMath.max(res,Math.max(maxNums[i],minNums[i]));}returnres;}}