题解
难度:简单
知识点:数学逻辑
最大值只能出现在以下两种情况的较大值:
- 最大的三个正数的乘积
- 最小的两个负数*最大的正数的乘积
所以找出最大三个正数和最小的两个负数这5个数即可
但是这道题要求时间复杂度o(n),但是空间复杂度o(1)
如果先把所有数存到数组中,然后排序找出这5个数,那么空间复杂度为o(n)
所以不能将全部数存到数组再排序,只能在输入的过程中就把最大的三个数和最小的两个数存起来,最后比较最大值的组合即可
#include<iostream> #include<limits.h> using namespace std; int main() { int i, n, num; long long max_mul; /* max1, max2, max3 分别为最大值,次大值,第三大值 * min1, min2 分别为最小值,次小值*/ long long max1, max2, max3, min1, min2; max1 = max2 = max3 = INT_MIN; min1 = min2 = INT_MAX; cin >> n; for(i = 0; i < n; i++) { cin >> num; if(num < min1) { min2 = min1; min1 = num; } else if(num < min2) { min2 = num; } if(num > max1) { max3 = max2; max2 = max1; max1 = num; } else if(num > max2) { max3 = max2; max2 = num; } else if(num > max3) { max3 = num; } } max_mul = max1*max2*max3 > max1*min1*min2 ? max1*max2*max3 : max1*min1*min2; cout << max_mul << endl; return 0; }