乘积最大子序列

找出一个序列中乘积最大的连续子序列(至少包含一个数)。

样例

比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6

思路:想到以什么结尾这种模式。以i结尾的情况下子数组的最大乘积,有三种情况:

1.等于 以i-1结尾的情况下子数组的最小乘积*当前数(这是针对负数乘负数的情况)

2.等于 以i-1结尾的情况下子数组的最大乘积*当前数(这是针对正数乘正数的情况)

3.等于 当前数(比如 当前数的前一个数是0等情况)

取这三种情况的最大值为当前位置能乘出来的的最大值

这三种情况的最小值为当前位置能乘出来的的最小值

更新维护这两个数组

上代码:

public class Solution {
    /**
     * @param nums: an array of integers
     * @return: an integer
     */
    public int maxProduct(int[] nums) {
        // write your code here
        if(nums==null||nums.length==0){
            return 0;
        }
        int len=nums.length;
        int[] max=new int[len];
        int[] min=new int[len];
        max[0]=nums[0];
        min[0]=nums[0];
        for(int i=1;i<len;i++){
            max[i]=Math.max(max[i-1]*nums[i],Math.max(nums[i],min[i-1]*nums[i]));
            min[i]=Math.min(max[i-1]*nums[i],Math.min(nums[i],min[i-1]*nums[i]));
        }
        int ma=Integer.MIN_VALUE;
        for(int i=0;i<len;i++){
            if(max[i]>ma){
                ma=max[i];
            }
        }
        return ma;
    }
}
时间: 2024-10-13 11:37:28

乘积最大子序列的相关文章

乘积最大子序列 Maximum Product Subarray

[抄题]: 找出一个序列中乘积最大的连续子序列(至少包含一个数). 比如, 序列 [2,3,-2,4] 中乘积最大的子序列为 [2,3] ,其乘积为6. [暴力解法]: 时间分析:每次j循环时都要再循环i找起点,直接用global[i - 1]存起来表示前i个元素,就不用找(且只存到i - 1) 空间分析: [思维问题]: [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: [二刷]: [三刷]: [四刷]:

152 Maximum Product Subarray 乘积最大子序列

找出一个序列中乘积最大的连续子序列(该序列至少包含一个数).例如, 给定序列 [2,3,-2,4],其中乘积最大的子序列为 [2,3] 其乘积为 6.详见:https://leetcode.com/problems/maximum-product-subarray/description/ 方法一: class Solution { public: int maxProduct(vector<int>& nums) { int size=nums.size(); if(size==0|

(Java) 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]

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

leetcode152. 乘积最大子序列

给定一个整数数组 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著作权归领扣网络所有.商业转载请联系官方授权,非商业

第152题:乘积最大子序列

一. 问题描述 给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 示例 1: 输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6. 示例 2: 输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组. 二. 解题思路 本题思路:采用动态规划的方法进行求解,找到最优子函数f(n)=max(f(n-1)*m(n),m(n)),其中f(n)代表前n的数中最大值,m(n)代表第n个数的

[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 著作权归领扣网络所有.商业转载请联

152乘积最大子序列

题目:给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数). 来源:https://leetcode-cn.com/problems/maximum-product-subarray/ 法一:别人代码 思路:由于想用动态规划解题,通过观察数字可以发现从nums[i]到nums[i+1]的最大值之间的关系,由于有负数的存在,最大值可能直接转化为最小值,所以为了无后效性,直接把前面的最大值和最小值保存了,每次乘完后再比较. class Solution: def

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 数组