既然题目分别要求了O(n)和O(1)的时空复杂度,那么就简单扫一遍数组就好。
根据提议,要找到最大乘积,要么是三个最大的正数相乘,要么是两个最小的负数及一个最大的正数相乘。
遍历数组,及时更新几个变量即可,注意不能用int,会溢出。
#include <iostream> #include <vector> using namespace std; int main() { int n; while (cin >> n) { int num; vector<int> nums; for (int i = 0; i < n; i++) { cin >> num; nums.push_back(num); } // 分别保存三个最大的正数,两个最小的负数 long long pNum1 = 0, pNum2 = 0, pNum3 = 0, nNum1 = 0, nNum2 = 0; for (const auto& x : nums) { if (x > 0 && x > pNum1) { pNum3 = pNum2; pNum2 = pNum1; pNum1 = x; } else if (x > 0 && x > pNum2) { pNum3 = pNum2; pNum2 = x; } else if (x > 0 && x > pNum3) { pNum3 = x; } else if (x < 0 && x < nNum1) { nNum2 = nNum1; nNum1 = x; } else if (x < 0 && x < nNum2) { nNum2 = x; } } cout << max(pNum1 * pNum2 * pNum3, pNum1 * nNum1 * nNum2) << endl; } return 0; }