Description
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
Example
For example, given the array [2,3,-2,4], the contiguous subarray [2,3] has the largest product = 6.
我的思路:动态规划题。这个题目要注意的是负数。如果全是正数,全部相乘即为最大。如果有负数,这个负数该不该乘。
既然是动态规划,一般两个for循环不能少。然后画图。可是这个图 该怎么画图,有点饶人。
图中虚线的下面部分是为nums[i]。上面部分是nums[i]*nums[i-1].画出这样的图之后 从矩阵中找到最大值。这个虽然是二维数组,但是我们可以优化成一维数组。而且冲与其从矩阵中找最大值,不如一边给矩阵赋值,一遍找最大值。
public int maxProduct(int[] nums) {
// write your code here
if(nums==null) return 0;
int[] temp=new int[nums.length];
int max=nums[0];
temp[0]=nums[0];
for(int i=1;i<nums.length;i++){
temp[i]=nums[i]*temp[i-1];
max=temp[i]>max?temp[i]:max;
}
//System.out.println(max);
for(int i=1;i<nums.length;i++){
for(int j=i;j<nums.length;j++){
if(i==j) temp[j]=nums[i];
else{
temp[j]=nums[j]*temp[j-1];
}
max=temp[j]>max?temp[j]:max;
}
}
return max;
}
别人的思路:在维护一个局部最大的同时,在维护一个局部最小,这样如果下一个元素遇到负数时,就有可能与这个最小相乘得到当前最大的乘积和
参考博客:http://blog.csdn.net/linhuanmars/article/details/39537283
public int maxProduct(int[] A) {
if(A==null || A.length==0)
return 0;
if(A.length == 1)
return A[0];
int max_local = A[0];
int min_local = A[0];
int global = A[0];
for(int i=1;i<A.length;i++)
{
int max_copy = max_local;
max_local = Math.max(Math.max(A[i]*max_local, A[i]), A[i]*min_local);
min_local = Math.min(Math.min(A[i]*max_copy, A[i]), A[i]*min_local);
global = Math.max(global, max_local);
}
return global;
}