Skip to content
On this page

628-三个数的最大乘积

标签:数组 数学 排序

题目信息

题目地址628. 三个数的最大乘积

题目内容:

javascript
给你一个整型数组nums,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

示例 1
    输入:nums = [1,2,3]
    输出:6

示例 2
    输入:nums = [1,2,3,4]
    输出:24

示例 3
    输入:nums = [-1,-2,-3]
    输出:-6

提示:
    3 <= nums.length <= 104
    -1000 <= nums[i] <= 1000

题解

解法一

思路:

可以先对数组进行从小到大排序,然后会有两种情况

当数组全为正数或负数时,最大的三个数乘积肯定是最大的。

当数组中既有正数也有负数时,两个最小的负数最大的正数的乘积可能会是最大的,也可能最大三个数的乘积是最大的

代码实现:

javascript
/**
 * @param {number[]} nums
 * @return {number}
 */
var maximumProduct = function(nums) {
    nums.sort((a, b) => a - b)
    const len = nums.length
    return Math.max(
        nums[len - 3] * nums[len - 2] * nums[len - 1],
        nums[0] * nums[1] * nums[len - 1]
    )
};

解法二

思路:

直接求出数组中最大的三个数最小的两个数

代码实现:

javascript
/**
 * @param {number[]} nums
 * @return {number}
 */
var maximumProduct = function(nums) {
    let max1 = -Infinity, max2 = -Infinity, max3 = -Infinity
    let min1 = Infinity, min2 = Infinity
    for(const num of nums) {
        // 先求出最大的三个数
        if(num > max1) {
            max3 = max2
            max2 = max1
            max1 = num
        }else if(num > max2) {
            max3 = max2
            max2 = num
        }else if(num > max3) {
            max3 = num
        }
        // 同理求出最小的两个数
        if(num < min1) {
            min2 = min1
            min1 = num
        }else if(num < min2) {
            min2 = num
        }
    }
    return Math.max(
        max1 * max2 * max3,
        max1 * min1 * min2
    )
};