开启掘金成长之旅!这是我参与「掘金日新计划 · 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
二、思路分析:
思路提示:三个数的最大乘积,有这么几种情况:
- 数组元素均为正数:则最大乘积为三个最大数的乘积;
- 数组元素有正数有负数:则最大乘积可能是三个最大正数的乘积,也可能是两个最小负数(绝对值最大)和一个最大正数的乘积;
- 数组元素均为负数:则最大乘积为最接近零的三个数的乘积,即三个最大数的乘积;
我们设置变量:
- 最小的数min1,第二小的数min2;
- 最大的数max1,第二大的数max2,第三大的数max3;
则最大乘积:
- 可能是三个最大数的乘积,即 max1 * max2 * max3;
- 可能是两个最小数和一个最大数的乘积,即 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;
}