基础算法:给定一个无序数组,包含正数、负数和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; }