1. 程式人生 > 實用技巧 >leetcode 628 三個數的最大乘積

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

}