题目描述
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
输入共2行,第一行包括一个整数n,表示数组长度
第二行为n个以空格隔开的整数,分别为A1,A2, … ,An
输出描述:
满足条件的最大乘积
输入
4
3 4 1 2
输出
24
定义五个数,一个最大,一个次大,一个第三大,一个最小,一个次小。只要找到这五个数,问题就解决了。因为最大乘积只可能是最大*(次大*第三大) 或者是 最大*(最小*次小)
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
long long Max_sum=0;
long long max1,max2,max3;
max1=max2=max3=INT_MIN;
long long min1,min2;
min1=min2=INT_MAX;
while(n--)
{
int num;
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;
}
Max_sum=max1*max2*max3 > max1*min1*min2 ? max1*max2*max3 : max1*min1*min2;
cout<<Max_sum<<endl;
return 0;
}