欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-13 12:50:48
...
  • 这里要注意的是当数字足够大的时候,我们要使用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;
    }

     

相关标签: 最大乘积