1. 程式人生 > 其它 >【LeetCode】628. 三個數的最大乘積

【LeetCode】628. 三個數的最大乘積

技術標籤:LeetCode

題目連結:https://leetcode-cn.com/problems/maximum-product-of-three-numbers/

難度:簡單

題目描述

給定一個整型陣列,在陣列中找出由三個陣列成的最大乘積,並輸出這個乘積。

測試資料

示例 1:

輸入: [1,2,3]
輸出: 6
示例 2:

輸入: [1,2,3,4]
輸出: 24
注意:

給定的整型陣列長度範圍是[3,104],陣列中所有的元素範圍是[-1000, 1000]。
輸入的陣列中任意三個數的乘積不會超出32位有符號整數的範圍。

題解

一看到“最大乘積”,第一反應就是先排序,然後最大的三個數乘積就是所求。但是,還要考慮負數的情況,比如[-6,-4,-3,-2,-1,2],這個序列的最大乘積=(-6)*(-4)* 2= 48。

方法一:先排序,然後返回”最大三個數的乘積“和“最小兩個負數及最大數的乘積”,兩者的較大者。

時間複雜度:O\left ( nlogn \right )

空間複雜度:O(1)

方法二:設定5個變數,分別記錄最大的三個數 和 最小的兩個數。

時間複雜度:O\left ( n \right )

空間複雜度:O(1)

程式碼

// 方法一

class Solution {
    public int maximumProduct(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length;
        return Math.max(nums[0]*nums[1]*nums[n-1], nums[n-1]*nums[n-2]*nums[n-3]);
    }
}
// 方法二

class Solution {
    public int maximumProduct(int[] nums) {
        int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
        int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
        for (int n : nums){
            if (n > max1){
                max3 = max2; max2 = max1; max1 = n; 
            } else if (n > max2){
                max3 = max2; max2 = n;
            } else if (n > max3){
                max3 = n;
            }
            if (n < min1){
                min2 = min1; min1 = n;
            } else if (n < min2){
                min2 = n;
            }
        }
        return Math.max(max1*max2*max3, min1*min2*max1);
    }
}