给出一个整数数组,有正有负有零,要求找出三个数,使其乘积最大

求三个数使乘积最大


给定一个无序数组,包含正数、负数和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;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值