[LeetCode] 152. 乘积最大子数组 ☆☆☆(动态规划)

乘积最大子数组

描述

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

示例 1:

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

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

解析

看起来和连续子数组的最大和类似,一个是和,一个是积。

其实有点不一样。如果当前元素为负数,那么当前元素的字数组最大值是前一个元素的最小值 * 当前元素。

所有,存储前一个元素的最小值min。当前元素为负数时,最大值为min * nums[i],最小值为max * nums[i]。

或者可以这么理解:当前元素为负数时,交换最大最小值即可。

代码

if (null == nums || nums.length <= 0) {
            return Integer.MIN_VALUE;
        }
        int res = nums[0];
        int max = nums[0];
        int min = nums[0];
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] < 0) {//当前元素为负数,交换最大最小值
                int temp = max;
                max = min;
                min = temp;
            }
            max = Math.max(nums[i] * max, nums[i]);
            min = Math.min(nums[i] * min, nums[i]);
            res = Math.max(max, res);
        }
        return res;

原文地址:https://www.cnblogs.com/fanguangdexiaoyuer/p/12172923.html

时间: 2024-11-04 17:12:09

[LeetCode] 152. 乘积最大子数组 ☆☆☆(动态规划)的相关文章

O(n)时间解决的面试题:乘积最大子数组

leetcode 152 ? ? 问题描述 ? ? 给定一个数组,求最大的连续子数组乘积最大 ? ? 分析问题 ? ? 跟求和最大子数组类似,我们也可以用动态规划来解这道题,解题之前我们需要考虑是否存在溢出,在不存在溢出的情况下我们需要记录之前乘积的绝对值,这里因为有正负性,负负得正,所以我们需要记录之前乘积的最大值和最小值两个值 ? ? 算法实现 ? ? int maxProduct(vector<int> &nums){ int n=nums.size(); if(n==0){ /

LeetCode——152. 乘积最大子序列

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组. https://leetcode-cn.com/problems/maximum-product-subarray/ 动态规划 其实这道题最直接的方法就是用 DP 来做,而且要用两个 dp 数组

[LeetCode] Maximum Subarray 最大子数组

Find the contiguous subarray within an array (containing at least one number) which has the largest sum. For example, given the array [−2,1,−3,4,−1,2,1,−5,4],the contiguous subarray [4,−1,2,1] has the largest sum = 6. click to show more practice. Mor

[LeetCode]152. 乘积最大子序列(DP)

题目 给定一个整数数组 nums?,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释:?子数组 [2,3] 有最大乘积 6. 示例 2: 输入: [-2,0,-1] 输出: 0 解释:?结果不能为 2, 因为 [-2,-1] 不是子数组. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-product-subarray 著作权归领扣网络所有.商业转载请联

LeetCode 152. 乘积最大子序列

给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组. 直接暴力求解 1 class Solution { 2 public int maxProduct(int[] nums) { 3 int i, j; 4 int max = -65535; 5

首尾相接的数组(环)-最大子数组

一 题目:一个首尾相接的一维整型数组,其中有正有负,求它的最大子数组并返回它的位置. 结对开发人员:朱少辉,侯涛亮 二 设计思路:设这个数组为a[n],那么扩大数组范围,使之为a[2*n],将a[0]~a[n-1]的值赋给a[n]-a[2*n-1],那么就相当于从第i个(i=0,1,2..n-1)到第i+n(不包含i+n)个中求最大的子数组,这时可以用到求一维数组(不是环)最大子数组动态规划的思想求解,每求得一个最大值进行比较,最后可求得最大子数组.至于求位置即最大子数组下标,可以附设一个指针j

[LeetCode] 152. Maximum Product Subarray 求最大子数组乘积

Given an integer array nums, find the contiguous subarray within an array (containing at least one number) which has the largest product. Example 1: Input: [2,3,-2,4] Output: 6 Explanation: [2,3] has the largest product 6. Example 2: Input: [-2,0,-1]

动态规划解决“最大子数组”问题

TODO: 动态规划到底是个什么玩艺? ref:http://www.cnblogs.com/waytofall/archive/2012/04/10/2439820.html I 只考虑怎样产生更大的子组和: 假设处理到第i个节点时: 1. 考虑是否i节点是否可使子组的和变大 a) 如果i节点大于0,则最大子组和是前面求到的数组和 加上 i节点值 b) 如果i节点小于0(等于0的话,值可以带上i,也可以不带上i,无所谓),当最大子数组的和是前面求的子组和 2. 然后考虑最大值是否应该更新了 a

最大子数组乘积算法

给出一数组a,求最大子数组乘积 算法思路:用动态垃规划.用maxValue(n)表示从0到n的最大子数组乘积,minValue(n)表示从0到n的最小子数组乘积. 状态转移方程为: minValue(n)= min{minValue(n-1)*a[n], maxValue(n-1)*a[n], a[n]} maxValue(n)=max{minValue(n-1)*a[n], maxValue(n-1)*a[n], a[n]} 在求取最大子数组乘积时,更新最大值结果. 代码如下: class S