LeetCode之Maximum Product Subarray

1.(原文)问题描述

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.

2.翻译

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

 例如,给予的数组是[2,3,-2,4]
连续的字数组[2,3]有最大的乘积=6

3.解决思路分析

  肯定可以通过其他方式实现就是不断的循环遍历,可是这样的代价太大,时间复杂度很高,我们j可以转换下思路好好想想如何最高效的来解决这个问题。

既然是求最大乘积那么我们需要考虑的就是最大乘积出现的情况可能有哪些:很显然有两种,第一种就是最大的累积乘以一个正数那么我们获取了更大的值,

还有就是一个最小的累积的值乘以一个负数,那么也可能获取的是最大的值,因为我们只需要保存乘积的最大和最小值。我们可以把数组的第一个值作为

最大最小值的逻辑值来处理,然后进行下去;如果之前的最大和最小值同当前元素相乘之后,没有当前元素大(或小)那么当前元素就可作为新的起点。

4.实现过程

Solution.java

package MaximumSubArray;

public class Solution {

	 public int maxProduct(int[] A) {
		 
		 if(A == null||A.length==0){
			 return 0;
		 }
		 int maxProduct = A[0];  //最大值的初始值
         int maxTemp   = A[0]; //累积的最大值 
         int minTemp  = A[0];  //累积的最小值
	          
         for(int i = 1;i < A.length;i++) {//从数组的第二个元素开始遍历
        	 
            int a = A[i]*maxTemp;  
            int b = A[i]*minTemp;  
            maxTemp = Math.max(Math.max(a,b), A[i]);//选取最大值的新起点  
            minTemp = Math.min(Math.min(a,b), A[i]);//选取最小值的新起点  
            maxProduct = Math.max(maxProduct, maxTemp);//更新最大值  
         }  
          return maxProduct;
	    }

}

 SolutionTest.java

package MaximumSubArray;

public class SolutionTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		int []array1 = {0,2,3,5,6,8,0,9};
		int []array2 = {1,-2,-3,-5,6,8,0,9};
		int []array3 = {1,2,-3,5,6,8,0,9};
		int []array4 = {1,2,0,5,6,8,0,9};
		
		System.out.println(new Solution().maxProduct(array1));
		System.out.println(new Solution().maxProduct(array2));
		System.out.println(new Solution().maxProduct(array3));
		System.out.println(new Solution().maxProduct(array4));
	}

}

 5.有句话很正确,解决思路很重要,重要的是思想。

posted on 2014-11-11 15:27  叼烟斗的纤夫  阅读(236)  评论(0编辑  收藏  举报