题目描述
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入
3 4 1 2
输出
24
- 思路
假设将数组从大到小排序后,会出现以下五种情况(n>3)
-
正正正
-
正正0
-
正0负
-
0负负
-
负负负
因为正正正、正负负可得正数,对于上述几种情况分别分析:
第一种:结果为max1max2max3、max1min2min1中较大的那一个
第二张:结果为0(即max1max2max3)、max1min2min1中较大的那一个
第三种:结果为max1min2min1
第四种:结果为0(即max1min2min1)
第五种:结果为max1max2max3
综上可得:结果为max1max2max3、max1min2min1中较大的那一个 -
C++实现
#include <iostream>
#include<limits.h>
using namespace std;
int main()
{
int n;
long long b,c,num,res,max1,max2,max3,min1,min2;
max1=max2=max3=INT_MIN;
min1=min2=INT_MAX;
cin>>n;
if(n<3)
res=0;
for(int i=0;i<n;i++){
cin>>num;
if(num<min1)
{
min2=min1;
min1=num;
}
else if(num<min2)
min2=num;
if(num>max1)
{
max3=max2;
max2=max1;
max1=num;
}
else if(num>max2)
{
max3=max2;
max2=num;
}
else if(num>max3)
max3=num;
}
b=max1*max2*max3;
c=max1*min2*min1;
res=b>c ? b:c;
cout<<res<<endl;
return 0;
}