# 628 三个数的最大乘积

# 题目

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

示例 1:

输入: [1,2,3]
输出: 6

示例 2:

输入: [1,2,3,4]
输出: 24

注意: 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。 输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。

# 题解

  1. 因为是寻找三个数的最大乘积,所以需要进行一次排序,然后分别对比前三个数和最大数 and 两个负数的乘积。
执行用时:144 ms, 在所有 JavaScript 提交中击败了 45.58% 的用户
内存消耗:42.4 MB, 在所有 JavaScript 提交中击败了 16.55% 的用户
/**
 * @param {number[]} nums
 * @return {number}
 */
var maximumProduct = function(nums) {
    const {length: l} = nums
    if(l < 3) return 0

    nums = nums.sort((a, b) => b - a) // 排序

    let max1 = nums[0] * nums[1] * nums[2]  // 获取前三个数的乘积
    let max2 = nums[0] * nums[l-1] * nums[l-2]  // 获取最大数和负数的乘积

    return max1 > max2 ? max1 : max2
};
  1. 第二种解法是通过动态维护 5 个数,分别是最大的三个数,和两个负数。然后进行比较。

TIP

执行用时:96 ms, 在所有 JavaScript 提交中击败了 94.87% 的用户

内存消耗:40.6 MB, 在所有 JavaScript 提交中击败了 98.56% 的用户

var maximumProduct = function(nums) {
    const { length: l } = nums;
    if (l < 3) return 0;

    let max1 = -Infinity;
    let max2 = -Infinity;
    let max3 = -Infinity;
    let min1 = 0;
    let min2 = 0;

    for (let i = 0; i < l; i++) {
    const current = nums[i];

    if (current > max1) {
        // 获取最大数
        max3 = max2
        max2 = max1
        max1 = current
    } else if (current > max2) {
        // 获取第二大的数
        max3 = max2
        max2 = current
    } else if (current > max3) {
        // 获取第三大的数
        max3 = current;
    }

    if (current < min1) {
        // 获取第二小的负数
        min2 = min1
        min1 = current
    } else if (current < min2) {
        // 获取最小的负数
        min2 = current;
    }
    }

    let val1 = max1 * max2 * max3;
    let val2 = max1 * min1 * min2;

    return val1 > val2 ? val1 : val2;
};
最后更新时间: 9/7/2020, 10:20:42 PM