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

题目分析:求一个数组,连续子数组的最大乘积。
解题思路:

其实子数组乘积最大值的可能性为:累乘的最大值碰到了一个正数;或者,累乘的最小值(负数),碰到了一个负数。所以每次要保存累乘的最大(正数)和最小值(负数)。同时还有一个选择起点的逻辑,如果之前的最大和最小值同当前元素相乘之后,没有当前元素大(或小)那么当前元素就可作为新的起点。例如,前一个元素为0的情况,{1,0,9,2},到9的时候9应该作为一个最大值,也就是新的起点,{1,0,-9,-2}也是同样道理,-9比当前最小值还小,所以更新为当前最小值。
这种方法只需要遍历一次数组即可,算法时间复杂度为O(n)。

代码:

public class MaximumProductSubarray
{

    public static void main(String[] args)
    {
        /**
         * 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.
         */
        int[] nums1 = { 2, 3, -2, 4 };
        System.out.println(maxProduct(nums1));
        /**
         * Example 2:
         * Input: [-2,0,-1]
         * Output: 0
         * Explanation: The result cannot be 2, because [-2,-1] is not a subarray.
         */
        int[] nums2 = { -2, 0, -1 };
        System.out.println(maxProduct(nums2));
    }

    public static int maxProduct(int[] nums)
    {
        if (nums.length == 1)
        {
            return nums[0];
        }
        int max = nums[0], tmpMax = nums[0], tmpMin = nums[0];
        for (int i = 1; i < nums.length; i++)
        {
            int a = tmpMax * nums[i];
            int b = tmpMin * nums[i];
            tmpMax = Math.max(Math.max(a, b), nums[i]);
            tmpMin = Math.min(Math.min(a, b), nums[i]);
            max = Math.max(max, tmpMax);
        }
        return max;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值