# 三个数的最大乘积(628)
# 题目
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
# 示例
输入: [1,2,3]
输出: 6
输入: [1,2,3,4]
输出: 24
- 给定的整型数组长度范围是
[3,104]
,数组中所有的元素范围是[-1000, 1000]
。 - 输入的数组中任意三个数的乘积
不会超出32位有符号整数
的范围。
# 算法
# 排序
按升序排列数组:
- 如果数组中所有数都为非负数,取
最后三个数字之积
- 如果有负数,那么最大值可能是
后三个数字之积
;也可能是前两个数字和最后一个数字之积
export const maximumProduct = (nums) => {
nums.sort((a, b) => a - b);
return Math.max(
nums[0] * nums[1] * nums[nums.length - 1],
nums[nums.length - 1] * nums[nums.length - 2] * nums[nums.length - 3]
);
};
1
2
3
4
5
6
7
2
3
4
5
6
7
# 找出三个最大数和两个最小数
通过上面的方法可知:只需要找出最大的三个数和最小的两个数即可
export const maximumProduct = (nums) => {
let firstMax = -Infinity,
secondMax = -Infinity,
thirdMax = -Infinity;
let firstMin = +Infinity,
secondMin = +Infinity;
for (let i = 0; i < nums.length; i++) {
if (nums[i] >= firstMax) {
thirdMax = secondMax;
secondMax = firstMax;
firstMax = nums[i];
} else if (nums[i] >= secondMax) {
thirdMax = secondMax;
secondMax = nums[i];
} else if (nums[i] >= thirdMax) {
thirdMax = nums[i];
}
if (nums[i] <= firstMin) {
secondMin = firstMin;
firstMin = nums[i];
} else if (nums[i] <= secondMin) {
secondMin = nums[i];
}
}
return firstMax * secondMax * thirdMax > firstMax * firstMin * secondMin
? firstMax * secondMax * thirdMax
: firstMax * firstMin * secondMin;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28