[编程题] 最大乘积
时间限制:1秒
空间限制:32768K
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
输入例子1:
4
3 4 1 2
输出例子1:
24
//思路是在输入过程中保存【最大的三个数】&【最小的二个数】
//判断下一个数是否进入最大前3位,只需判断它是否>3个数的最小值,如果成立,则替换掉这个最小值;最小前2位同理
//考虑到溢出问题,这里用long long
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int tmp;
vector<long long> max;
vector<long long> min;
int n;
cin >> n;
while (n--) {
cin >> tmp;
sort(max.begin(), max.end(), greater<long long>());
sort(min.begin(), min.end());
if (max.size() < 3) max.push_back(tmp);
else if (tmp > max[2]) max[2] = tmp;
if (min.size() < 2) min.push_back(tmp);
else if (tmp < min[1]) min[1] = tmp;
}
sort(max.begin(), max.end(), greater<int>());
sort(min.begin(), min.end());
long long a = max[0] * max[1] * max[2];
long long b = min[0] * min[1] * max[0];
cout << (a > b ? a : b) << endl;
return 0;
}