leetcode 628 三个数的最大乘积

package com.example.lettcode.dailyexercises;

import java.util.Arrays;

/**
 * @Class MaximumProduct
 * @Description 628 三个数的最大乘积
 * 给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
 * <p>
 * 示例 1:
 * 输入: [1,2,3]
 * 输出: 6
 * <p>
 * 示例 2:
 * 输入: [1,2,3,4]
 * 输出: 24
 * <p>
 * 注意:
 * 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
 * 输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
 * @Author
 * @Date 2021/1/20
 **/
public class MaximumProduct {
    /**
     * 首先将数组排序。
     * 如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;
     * 如果全是非正数,则最大的三个数相乘同样也为最大乘积。
     * 如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。
     *
     * 综上,我们在给数组排序后,
     * 分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案
     * @param nums
     * @return
     */
    public static int maximumProduct(int[] nums) {
        if (nums == null || nums.length < 3) return 0;
        if (nums.length == 3) return nums[0] * nums[1] * nums[2];
        Arrays.sort(nums);
        int n = nums.length;
        return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
    }
}
// 测试用例
public static void main(String[] args) {
	int[] nums = new int[]{1, 2, 3};
	int ans = maximumProduct(nums);
	System.out.println("MaximumProduct demo01 result:" + ans);

	nums = new int[]{1, 2, 3, 4};
	ans = maximumProduct(nums);
	System.out.println("MaximumProduct demo02 result:" + ans);

	nums = new int[]{-4, -1, 2, 3};
	ans = maximumProduct(nums);
	System.out.println("MaximumProduct demo03 result:" + ans);

	nums = new int[]{-4, 1, 2, 3, 6};
	ans = maximumProduct(nums);
	System.out.println("MaximumProduct demo04 result:" + ans);

}
原文地址:https://www.cnblogs.com/fyusac/p/14301816.html