152. Maximum Product Subarray

来源:互联网 发布:淘宝牙齿矫正器有用吗 编辑:程序博客网 时间:2024/06/08 03:35

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.

对于这道题,我最初的分析是利用动态规划或者滑动窗口去实现,后来我没有找到状态转移方程,而对于滑动窗口也没有找到如何将窗口进行滑动的规律,无奈只有看别人的解决方案来学习,最后知道这道题是利用动态规划的方式,用动态规划的方法,就是要找到转移方程式,也叫动态规划的递推式,动态规划需要我们维护两个变量,局部最优和全局最优,对于Maximum SubArray的情况,如果遇到负数,想加之后的值肯定比原值小,但可能比当前值大,也有可能小,所以,对于相加的情况,只要能够处理局部最大和全局最大的关系就可以,但是在本题中存在这种情况,就是两个负数相乘最终可以得到一个正数,因此我们还需要保留局部最小值,因为局部最小值为负值的情况下,当遇到另外一个负值的时候,有可能成为最大值的因子,代码如下:

public int maxProduct(int[] nums) {
        // 特殊情况处理
        if(nums == null || nums.length == 0){
            return 0;
        }
        
        int localMin = nums[0], localMax = nums[0], globalMax = nums[0];
        for(int i = 1; i < nums.length; i++){
            int tempNum = localMin;
            localMin = Math.min(Math.min(nums[i], nums[i] * localMin), nums[i] * localMax);
            localMax = Math.max(Math.max(nums[i], nums[i] * localMax), nums[i] * tempNum);
            globalMax = Math.max(localMax, globalMax);
        }
        return globalMax;
    }

0 0