LeetCode 动态规划之乘积最大子数组

简介: 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] <= 10
nums 的任何前缀或后缀的乘积都 保证 是一个 32-位 整数


题解


解题分析


题解思路


  1. 该题是一个典型的动态规划题目;


  1. 我们需要不断的去遍历数组,获取最大值 maxF = Math.max(mx * nums[i], nums[i]);


  1. 由于数组中存在负数,可能导致最大的值变为最小值,最小值变为最大值。因此还需要维护当前的最小值


minF = Math.min(mn * nums[i], nums[i]); 4. 如果负数出现的时候 ,min, max 进行交换再进行下一步计算;


复杂度分析


  • 时间复杂度:O(N)


  • 空间复杂度:O(1)


解题代码


题解代码如下(代码中有详细的注释说明):


class Solution {
    public int maxProduct(int[] nums) {
        // maxF 最大值, minF 最小值, ans 结果
        int maxF = nums[0], minF = nums[0], ans = nums[0];
        // 数组长度
        int len = nums.length;
        for (int i =1; i < len; i++) {
            // 保存旧数据
            int mx = maxF , mn = minF;
            // 更新最大值
            maxF = Math.max(mx * nums[i], Math.max(nums[i], mn * nums[i]));
            // 更新最小值
            minF = Math.min(mn * nums[i], Math.min(nums[i], mx * nums[i]));
            // 更新结果
            ans = Math.max(maxF, ans);
        }
        // 返回
        return ans;
    }
}


提交后反馈结果:


image.png


参考信息



相关文章
|
9天前
|
索引
力扣随机一题 6/26 哈希表 数组 思维
力扣随机一题 6/26 哈希表 数组 思维
9 0
|
9天前
|
存储 算法 索引
力扣每日一题 6/24 模拟 数组 单调栈
力扣每日一题 6/24 模拟 数组 单调栈
7 0
|
9天前
力扣随机一题 哈希表 排序 数组
力扣随机一题 哈希表 排序 数组
8 1
|
9天前
|
存储 算法
力扣每日一题 6/20 数学+数组
力扣每日一题 6/20 数学+数组
7 1
|
9天前
|
缓存
力扣每日一题 6/14 动态规划+数组
力扣每日一题 6/14 动态规划+数组
8 1
|
22天前
|
C++ Python
二刷力扣--数组
二刷力扣--数组
|
5天前
2670.找出不同元素数目差数组-力扣(LeetCode)
2670.找出不同元素数目差数组-力扣(LeetCode)
5 0
|
9天前
|
算法 索引
力扣随机一题 位运算/滑动窗口/数组
力扣随机一题 位运算/滑动窗口/数组
10 0
|
9天前
|
算法 索引
力扣每日一题 6/28 动态规划/数组
力扣每日一题 6/28 动态规划/数组
7 0
|
9天前
力扣随机一题 6/28 数组/矩阵
力扣随机一题 6/28 数组/矩阵
11 0