在一个数组中找到连续的子数组最大的乘积

原题目:https://oj.leetcode.com/problems/maximum-product-subarray/


例如输入[2,3,-2,4]

符合条件的子数组应该是[2,3],他们的乘积是6


/**
 * @Author jiangfq
 * 
 */
package com.test;

/**
 * @author jiangfq
 *
 */
public class Solution {

	/**
	 * @Author jiangfq
	 *
	 */
	public static void main(String[] args) {
		int[] a = {-3,0,1,-2};
		Solution s = new Solution();
		int b = s.maxProduct(a);
		System.out.println("b=" + b);
	}
	
	public int maxProduct(int[] A) {
        if(A.length == 0) {  //如果是0,则返回0
        	return 0;
        } else if(A.length == 1) {  //如果有一个
        	return A[0];
        } else if(A.length == 2) {  //如果数组有两个元素
        	if(A[0] > A[0]*A[1]) {
        		return A[0];
        	} else if(A[1] > A[0]*A[1]) {
        		return A[1];
        	}
        	return A[0]*A[1];
        } else {
        	int ood = 0; //记录负数的个数
        	int sum = 1;
        	for(int i = 0; i < A.length; i++) {  //先计算负数个数以及总乘积
        		sum *= A[i];
        		if(A[i] < 0) {
        			ood++;
        		} 
        	}
        	if(ood !=0 && ood%2==0 && sum != 0) {
        		return sum;
        	} else {
        		int max = A[0];   //记录当前的最大值
        		int prev = max;  //记录前一个最大值,方便与当前最大值做比较
        		for(int i = 0; i < A.length; i++) {
        			max = A[i];
        			int s = max;
        			if(s == 0) {  //如果是0,则跳过
        				continue;
        			}
        			for(int j = i+1; j < A.length; j++) {
        				s *= A[j];
        				if(max < s) {
        					max = s;
        				}
        			}
        			if(prev < max) {
        				prev = max;
        			}
        		}
        		return prev;
        	}
        }
    }

}

你可能感兴趣的:(算法,java源码分析)