leetcode-628. 三个数的最大乘积

176 阅读1分钟
/**
 * ref:https://leetcode-cn.com/problems/maximum-product-of-three-numbers/
 * 给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
 * 示例 1:
 * 输入:nums = [1,2,3]
 * 输出:6
 * 示例 2:
 * 输入:nums = [1,2,3,4]
 * 输出:24
 * 示例 3:
 * 输入:nums = [-1,-2,-3]
 * 输出:-6
 **/
public class MaxProductFromThreeNumbers {

    public static void main(String[] args){
        System.out.println(maxProduct(new int[]{1,2,3,4}));
        System.out.println(maxProduct(new int[]{4,3,2,1}));
        System.out.println(maxProduct(new int[]{-1,-2,-3,-4}));
        System.out.println(maxProduct(new int[]{1,2,3,-1,-2,-3}));
    }

    /**
     * 计算数组中三个元素的最大值
     * 如果全是正数,则依次取出三个最大的数,进行乘积即可。
     * 如果全是负数,则依次取出三个最大的数,进行乘积即可。
     * 如果既有正数也有负数,就需要取出负数中最小的两个,以及正数中最大的三个,
     * 然后比较正数最大三个乘积和两个最小负数乘积与最大正数乘积间那个最大,则为需要的那三个数。
     * 综合上述分析:
     * 需要取出最大三个正数和最小的二个负数,然后乘积后进行比较
     * @param array
     * @return
     */
    public static int maxProduct(int[] array){
        // 首先定义出5个数,分别为最大三个和最小二个
        int max1 = Integer.MIN_VALUE;
        int max2 = Integer.MIN_VALUE;
        int max3 = Integer.MIN_VALUE;
        int min1 = Integer.MAX_VALUE;
        int min2 = Integer.MAX_VALUE;
        // 迭代
        for(int a:array){
            // 如果a大于最大max1值,则将a赋值给max1,之后2个次最大值依次赋值原来max1和max2
            if(a>max1){
                max3 = max2;
                max2 = max1;
                max1 = a;
            }else if(a>max2){
                max3 = max2;
                max2 = a;
            }else if(a>max3){
                max3 = a;
            }
            // 如果a小于min1,则将a赋值给min1,之后次最小值min2原来min1
            if(a<min1){
                min2 = min1;
                min1 = a;
            }else if(a<min2){
                min2 = a;
            }
        }
        return Math.max(max1*max2*max3,max1*min1*min2);
    }
}