# 628 三个数的最大乘积
# 题目
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入: [1,2,3]
输出: 6
示例 2:
输入: [1,2,3,4]
输出: 24
注意: 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。 输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
# 题解
- 因为是寻找三个数的最大乘积,所以需要进行一次排序,然后分别对比前三个数和最大数 and 两个负数的乘积。
执行用时:144 ms, 在所有 JavaScript 提交中击败了 45.58% 的用户
内存消耗:42.4 MB, 在所有 JavaScript 提交中击败了 16.55% 的用户
内存消耗: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
};
- 第二种解法是通过动态维护 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;
};