LeetCode 628. 三个数的最大乘积

47 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第21天,点击查看活动详情

一、题目描述:

628. 三个数的最大乘积 - 力扣(LeetCode) (leetcode-cn.com)

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

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [-1,-2,-3]
输出:-6

  提示:

  • 3 <= nums.length <= 10^4
  • -1000 <= nums[i] <= 1000

二、思路分析:

思路提示:三个数的最大乘积,有这么几种情况:

  1. 数组元素均为正数:则最大乘积为三个最大数的乘积;
  2. 数组元素有正数有负数:则最大乘积可能是三个最大正数的乘积,也可能是两个最小负数(绝对值最大)和一个最大正数的乘积;
  3. 数组元素均为负数:则最大乘积为最接近零的三个数的乘积,即三个最大数的乘积;

我们设置变量:

  1. 最小的数min1,第二小的数min2;
  2. 最大的数max1,第二大的数max2,第三大的数max3;

则最大乘积:

  1. 可能是三个最大数的乘积,即 max1 * max2 * max3;
  2. 可能是两个最小数和一个最大数的乘积,即 min1 * min2 * max1。

三、AC 代码:

int maximumProduct(int* nums, int numsSize){
    int MAX = 1000, MIN = -1000;
    int max1 = MIN, max2 = MIN, max3 = MIN;
    int min1 = MAX, min2 = MAX;
    for(int i = 0; i < numsSize; i++){
        if(nums[i] < min1){
            min2 = min1;
            min1 = nums[i];
        }else if(nums[i] < min2){
            min2 = nums[i];
        }

        if(nums[i] > max1){
            max3 = max2;
            max2 = max1;
            max1 = nums[i];
        }else if(nums[i] > max2){
            max3 = max2;
            max2 = nums[i];
        }else if(nums[i] > max3){
            max3 = nums[i];
        }
    }
    if(max1 * max2 * max3 > max1 * min1 * min2){
        return max1 * max2 * max3;
    }
    return max1 * min1 * min2;
}

范文参考:

字节题库 - #628 - 简单 - 三个数的最大乘积 - 1刷 - 三个数的最大乘积 - 力扣(LeetCode)

根据数组中正数、零、负数的量情况进行讨论【有点笨的方法】 - 三个数的最大乘积 - 力扣(LeetCode)