从零开始刷力扣(三)——628. 三个数的最大乘积

分类:数组的遍历

题目描述:

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

示例1:

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

示例2:

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

注意:

  1. 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
  2. 输入的数组中任意三个数的乘积不会超出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)
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值