最大乘积

题目
公司:拼多多
类型:数组
题意:注意时间必须是线性的,所以遍历三次从数组中找出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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值