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.

题目大意:

找到数组的子数组最大的乘积

解法:

因为数组是整数数组,当数组全是正数的时候,全部相乘得到的结果是最大的乘积,只有数组中的负数能够影响数组乘积的结果。所以当数组中存在奇数个负数的时候,需要舍去最左或者是最右的负数。

java:

class Solution {
    public int maxProduct(int[] nums) {
        int res=nums[0];
        int curRes=1;
        for(int i=0;i<nums.length;i++){
            curRes*=nums[i];
            res=Math.max(curRes,res);
            if (curRes==0) curRes=1;
        }

        curRes=1;
        for(int i=nums.length-1;i>=0;i--){
            curRes*=nums[i];
            res=Math.max(curRes,res);
            if (curRes==0) curRes=1;
        }

        return res;
    }
}

还有一种解法的思想是最大乘积一定是从当前乘积的最大值和最小值中产生,记录这两个值,并比较当前乘积的最大值和结果,得到数组的最大乘积。

java:

class Solution {
    public int maxProduct(int[] nums) {
        int res=nums[0];
        int rmin=nums[0],rmax=nums[0];
        for(int i=1;i<nums.length;i++){
            if(nums[i]<0){
                int tmp=rmin;
                rmin=rmax;
                rmax=tmp;
            }
            rmin=Math.min(rmin*nums[i],nums[i]);
            rmax=Math.max(rmax*nums[i],nums[i]);
            
            res=Math.max(rmax,res);
        }
        
        return res;
    }
}
posted @ 2019-04-22 20:57  小白兔云  阅读(100)  评论(0编辑  收藏  举报