求三个数使乘积最大
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
//1.全都是正数,MAX1*MAX2*MAX3(最大的三个数相乘)
//2.全都是负数,MAX1*MAX2*MAX3(最大的三个数相乘)
//3.有正有负(1)最大应该是正数,因为有正有负的话,三个数相乘总能得到正数
// 只可能这样产生MAX1*MAX2*MAX3(全正),MAX1*MIN1*MIN2(一正两负)
//4.考虑0,不改变上面的分析
//总结:所以只要两个表达式就可以约束这个解,那就是MAX1*MAX2*MAX3,MAX1*MIN1*MIN2
// 那么哪个是对的呢,取最大值不就OK了吗。
#include <iostream>
#include <algorithm>
#include <cmath>
#include <limits.h>
#define MAX_NUM_OF_NUMBERS 10000
using namespace std;
int main(){
int num_of_numbers=0;
long long max1=INT_MIN;
long long max2=INT_MIN;
long long max3=INT_MIN;
long long min1=INT_MAX;
long long min2=INT_MAX;
int nums[MAX_NUM_OF_NUMBERS];
cin>>num_of_numbers;
int i=0;
int temp=0;
long long ans=0;
while(i<num_of_numbers){
cin>>nums[i];
i++;
}
for(i=0;i<num_of_numbers;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(nums[i]<min1){
min2=min1;
min1=nums[i];
}else if(nums[i]<min2){
min2=nums[i];
}
}
ans=max(max1*max2*max3,max1*min1*min2);
//cout<<max1<<" "<<max2<<" "<<max3<<" "<<min1<<" "<<min2;
cout<<ans;
return 0;
}