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);
}