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

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

     

你可能感兴趣的:(基础算法)