# 三个数的最大乘积(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

# 找出三个最大数和两个最小数

通过上面的方法可知:只需要找出最大的三个数和最小的两个数即可

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