基础算法:给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)

  • 这里要注意的是当数字足够大的时候,我们要使用long long形式的类型,用来记录那个最大值
  • 最大值共有四种情况:
    • 三个正数:数字本身越大则乘积越大
    • 两个负数一个正数:负负得正,所以两个负数最小,之积最大
    • 两个正数一个负数:
      • 这种情况,如果只有【正,正,负】【正,正,负,负】【正,正,负,负,负】【正,正,正,负,负】
      • 所有的情况都包含在第一种和第二种情况里,所以这种情况可以去掉。
    • 三个负数:
      • ​​​​​​​这种情况只有【负,负,负】这一种情况,这种情况和第一种相重合,所以也可以去掉
  • ​​​​​​​所以这里需要求五个数,三个最大,和两个最小,之后将上述的两种情况相比较,那个大就是那个
  • #include<stdio.h>
    #define N 10000
    int main(void){
    	int A[N]={0};
    	//输入数组个数;
    	int n;
    	scanf("%d",&n);
    	//输入数组
    	for(int k=0;k<n;k++){
    		scanf("%d",&A[k]);
    	}
    
    	int m1=0,m2=0,m3=0,x1=0,x2=0;
    
    	//找到最大的三位数以及最小的两位数
    	for(int i=0;i<n;i++){
    		if(A[i]>0){
    			if(A[i]>m1){
    				m3=m2;
    				m2=m1;
    				m1=A[i];
    			}else if(A[i]>m2){
    				m3=m2;
    				m2=A[i];
    			}else if(A[i]>m1){
    				m3=A[i];
    			}
    		}else{
    			if(A[i]<x1){
    				x2=x1;
    				x1=A[i];
    			}else if(A[i]<x2){
    				x2=A[i];
    			}
    		}
    	}
        long temp=m1*m2;
    	long long max=temp*m3;
    	temp = x1*x2;
    	long long max1=m1*temp;
    	if(max1>max)
    		max=max1;
    	printf("%lld",max);
    	return 0;
    }

     

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值