分类:数组的遍历
题目描述:
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例1:
输入: [1,2,3]
输出: 6
示例2:
输入: [1,2,3,4]
输出: 24
注意:
- 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
- 输入的数组中任意三个数的乘积不会超出32位有符号整数的范围
思路一:
将数组分为正数和负数两个子数组并排序,若全为正数或全为负数则取最大的3个数相乘,若既有正数又有负数,则取最大的三个数相乘的值与最小的两个负数之积与最大的正数相乘结果的最大值;
代码实现一:
var maximumProduct = function (nums) {
const positiveNums = nums.filter(num => num < 0).sort((a, b) => b - a);
const activeNums = nums.filter(num => num >= 0).sort((a, b) => b - a);
const len = positiveNums.length;
// 全部是正整数,取最大的三个正整数相乘
if (positiveNums.length === 0) {
return activeNums[0] * activeNums[1] * activeNums[2];
}
// 全部是负整数,取最大的三个负整数相乘
if (activeNums.length === 0) {
return positiveNums[0] * positiveNums[1] * positiveNums[2];
}
// 既有正数又有负数,取最小的两个负整数和最大的正整数相乘,与最大的三个正整数相乘做比较
const max1 = positiveNums[len - 1] * positiveNums[len - 2] * activeNums[0];
const max2 = activeNums.length > 3 ? activeNums[0] * activeNums[1] * activeNums[2] : 0;
return max1 > max2 ? max1 : max2;
};
思路二:
思路一的优化,不需要过滤出子数组,直接比较排序并取最大的三个值相乘之积与最小的两个数之积与最大数相乘结果的最大值即可。
代码实现二:
var maximumProduct = function(nums) {
nums.sort((a, b) => b - a)
let max1 = nums[0] * nums[1] * nums[2]
let max2 = nums[nums.length -1] * nums[nums.length - 2] * nums[0]
return Math.max(max1, max2)
};