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.
代码:
如果等于0显然要重新进行统计,所以我们可以用0作为区间分割点。
在两个0之间,如果第一次出现负数,那么应该重新进行统计,如果第二次出现负数,说明两个负数能够为正。所以我们需要一个变量记录负数乘积,等第二次出现时对其进行纠正。
其实对于两个0之间如果存在偶数个负数,那么整个区间就是最大值,如果是奇数,那么就要抛弃前一个或者后一个负数。

class Solution {
    public int maxProduct(int[] nums) {
        //nums = new int[]{1,-2,1,-2,1,-2,1,-2,1,-2,100};
        int max = nums[0];
        int pro=1,neg=1;
        
        for(int num : nums){
            if(num>0){
                max = Math.max(max, pro*num);
                pro *= num;
                neg *= num;
            }else if(num<0){
                max = Math.max(max, neg*num);
                int tmp = pro;
                pro = Math.max(neg*num, 1);
                neg = tmp*num;
            }else{
                max = Math.max(max, 0);
                pro = 1;
                neg = 1;
            }
            //System.out.println(neg);
        }
        return max;
    }
}

neg:
1
-2
-2
-2
-2
-8
-8
-8
-8
-32
-3200

猜你喜欢

转载自blog.csdn.net/qq_16234613/article/details/89841022