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]
Output: 0
Explanation: The result cannot be 2, because [-2,-1] is not a subarray.

翻译:

给定一个整数数组号,在一个具有最大乘积的数组(至少包含一个数字)中找到相邻的子数组。
示例1:
输入:(2、3、2、4)
输出:6
说明:[2,3]有最大的乘积6。
示例2:
输入(2 0 1):
输出:0
说明:结果不能是2,因为[-2,-1]不是子数组。

思路:

这道题是找到具有最大乘积的数组的连续子数组。
连续数字的乘积,关键问题是对负值的处理。
我们使用min,max分别记录从开始位置到当前位置i可以获得的最大乘积和最小乘积值。
当nums[i]<0时:

  • 负数因子可以使大的值减小,小的值增大。
    因此交换最大值和最小值,在对min和max进行更新。
    即当前数字的最大乘积要么是自己本身,要么是前面最大乘积乘以当前数字,最小乘积同理。

时间复杂度:O(n);

代码实现:

class Solution {
    public int maxProduct(int[] nums) {
        if(nums==null){
            return -1;
        }else if(nums.length==1){
            return nums[0];
        }
        int max=nums[0];
        int min=nums[0];
        int maxx=nums[0];
        for(int i=1;i<nums.length;i++){
            if(nums[i]<0){
                int tmp=max;
                max=min;
                min=tmp;
            }
            max=Math.max(nums[i],nums[i]*max);
            min=Math.min(nums[i],nums[i]*min);
            maxx=Math.max(max,maxx);
        }
        return maxx;
    }
}

你可能感兴趣的:(LeetCodeTop100)