题目描述
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
示例1
输入
3 4 1 2
输出
24
思路
很简单的一道题。因为要求O(n)的时间复杂度,所以直接遍历就行。而3数乘积最大,则分为以下两种情况:
(1)最大正整数 * (第二大整数 * 第三大正整数)
(2)最大正整数 * (最小负整数 * 第二小负整数)
若最大正整数为0,那最大乘积必为0;若不为0,则比较(1)和(2)的大小。
所以,遍历找到这5个数即可。
我提交的代码
#include <iostream>
#include <vector>
int main(){
long maxPosNum = 0, secPosNum = 0, thirdPosNum = 0;
long maxNegativeNum = 0, secNegativeNum = 0;
int n; // 数组大小
std::cin >> n;
while (n < 3)
std::cin >> n;
std::vector<long long> arr(n);
for (long long i = 0; i < n; ++i){
std::cin >> arr[i];
}
for (long long i = 0; i < n; ++i){
if (arr[i] > 0) {
if (arr[i] > maxPosNum){
thirdPosNum = secPosNum;
secPosNum = maxPosNum;
maxPosNum = arr[i];
}
else if (arr[i] > secPosNum){
thirdPosNum = secPosNum;
secPosNum = arr[i];
}
else if (arr[i] > thirdPosNum){
thirdPosNum = arr[i];
}
}
else{
if (arr[i] < maxNegativeNum){
secNegativeNum = maxNegativeNum;
maxNegativeNum = arr[i];
}
else if (arr[i] < secNegativeNum){
secNegativeNum = arr[i];
}
}
}
if (maxPosNum == 0)
return 0;
long long val1 = maxPosNum * secPosNum * thirdPosNum;
long long val2 = maxPosNum * maxNegativeNum * secNegativeNum;
std::cout<< ( val1 > val2 ? val1 : val2 ) << std::endl;
return 0;
}