leetcode 628 三個數的最大乘積
阿新 • • 發佈:2021-01-20
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); }