前言
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入:nums = [1,2,3]
输出:6
示例 2:
输入:nums = [1,2,3,4]
输出:24
示例 3:
输入:nums = [-1,-2,-3]
输出:-6
一、思路分析
- 如果数组中全是非负数,则排序后最大的三个数相乘,即为最大乘积;
- 如果全是非正数,则最大的三个数相乘,同样也为最大乘积;
- 如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对
值最大)与最大正数的乘积。
解题关键:分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答
案。
二、解题代码
2.1 排序法
// 排序法
int maximumProduct(int* nums, int numsSize){
//排序,此处用伪代码替代
long max = ((nums[numsSize-1] * nums[numsSize-2] * nums[numsSize-3]) > (nums[0] * nums[1] * nums[numsSize-1]))
? (nums[numsSize-1] * nums[numsSize-2] * nums[numsSize-3])
: (nums[0] * nums[1] * nums[numsSize-1]);
return max;
}
2.2 线性扫描法
注意:对数组的取数,不能重复取一个索引。
//线性扫描法
int maximumProduct(int* nums, int numsSize){
int bit_nums = sizeof(int) * 8;
int MAX = (long)pow(2, bit_nums-1) - 1;
int MIN = -((long)MAX + 1);
int min1 = MAX, min2 = MAX; // min1 是最小, min2 是次最小
int max1 = MIN, max2 = MIN, max3 = MIN; // max1 是最大,max2 是次最大,max3 是次次最大
for (int i = 0; i < numsSize; i++)
{
int x = nums[i];
if(x < min1)
{
min2 = min1;
min1 = x;
}
else if(x < min2)
{
min2 = x;
}
if(x > max1)
{
max3 = max2;
max2 = max1;
max1 = x;
}
else if(x > max2)
{
max3 = max2;
max2 = x;
}
else if(x > max3)
{
max3 = x;
}
}
return ((max3 * max2 * max1) > (min2 * min1 * max1))
? (max3 * max2 * max1)
: (min2 * min1 * max1);
}