题目
公司:拼多多
类型:数组
题意:注意时间必须是线性的,所以遍历三次从数组中找出3个数使乘积最大,注意有负数和0,所以不仅要算正数最大的,也要算负数最大的。这道题的坑应该有很多,虽然通过了这道题,但是代码不是完备的,还可以被特殊的数据攻击。如果时间充裕的大佬可以自行完备。下面我提供部分思路。
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+5;
int a[N];
int main(){
int n;
//正数 负数 0 超int
scanf("%d", &n);
memset(a, 0, sizeof a);
for(int i = 1; i <= n; i++){
scanf("%d", a+i);
}
//零
bool zero = false;
//正数
int f = 0, s = 0, t = 0;
a[0] = -0x3f3f3f3f;
for(int i = 1; i <= n; i++){
if(a[i] == 0) zero = true;
if(a[i] != 0 && a[i] > a[f]) f = i;
}
for(int i = 1; i <= n; i++) if(a[i] != 0 && a[i] > a[s] && i != f) s = i;
for(int i = 1; i <= n; i++) if(a[i] != 0 && a[i] > a[t] && i != f && i != s) t = i;
//负数
int ff = 0, ss = 0;
a[0] = 0x3f3f3f3f;
for(int i = 1; i <= n; i++) if(a[i] != 0 && a[i] < a[ff]) ff = i;
for(int i = 1; i <= n; i++) if(a[i] != 0 && a[i] < a[ss] && i != ff) ss = i;
//最大值可能的值 三个正数 两个负数一个正数
long long res = max(a[f]*1ll*a[s]*a[t], a[f]*1ll*a[ff]*a[ss]);
//如果乘积是负数 则判断有没有0出现 有则为0最大
if(zero && res < 0) res = 0;
printf("%lld\n", res);
return 0;
}