Leetcode:152. 乘积最大子数组

乘积最大子数组

题目描述

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字)。

示例 1:

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

示例 2:

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

思路

可以维护两个DP,表示最大值和最小值(因为数据中包含正负),转移方程为$maxDP[i+1] = max(nums[i+1], maxDP[i+1]*nums[i+1], minDP[i+1]*nums[i+1])$以及$minDP[i+1] = min(nums[i+1], maxDP[i+1]*nums[i+1], minDP[i+1]*nums[i+1])$,由于只涉及DP的两个状态值,所以去除掉所有状态的存储,只存储上一状态即可。

代码

class Solution {
    public int maxProduct(int[] nums) {
        int result = nums[0];
        int maxNum = 1;
        int minNum = 1;
        for(int i = 0; i < nums.length; i++){
            if (nums[i] < 0){
                maxNum = maxNum + minNum;
                minNum = maxNum - minNum;
                maxNum = maxNum - minNum;
            }
            maxNum = nums[i] > maxNum * nums[i] ? nums[i]: maxNum * nums[i];
            minNum = nums[i] < minNum * nums[i] ? nums[i]: minNum * nums[i];
            if(result < maxNum){
                result = maxNum;
            }
        }
        return result;
    }
}

复杂度分析

时间复杂度

$O(n)$

空间复杂度

$O(1)$

总结

可以使用多个DP过程存储中间可能状态


文章作者: 小风雷
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小风雷 !
评论
 上一篇
Leetcode:189. 旋转数组 Leetcode:189. 旋转数组
Leetcode:189. 旋转数组题目描述给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右旋转
2020-03-25
下一篇 
Leetcode:344. 反转字符串 Leetcode:344. 反转字符串
Leetcode:344. 反转字符串题目描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
2020-03-24
  目录