描述
给定一个长度为 nn 的无序数组 AA ,包含正数、负数和 0 ,请从中找出 3 个数,使得乘积最大,返回这个乘积。
输入:[3,4,1,2]
返回值:24
要求时间复杂度: O(n),空间复杂度: O(1)。
解题思路
遍历数组,找到最大的三个数和最小的两个数,三个数的最大乘积来源可能有两种,一种是三个最大的数相乘,另一种是两个最小的数和一个最大的数相乘
class Solution {
public:
long long solve(int* A, int ALen) {
int max1=INT_MIN,max2=INT_MIN,max3=INT_MIN;//最大的,第二大的,第三大的
int min1=INT_MAX,min2=INT_MAX;//最小的,第二小的(负数要用)
for(int i=0;i<ALen;i++){
if(A[i]<min1){
min2=min1;
min1=A[i];
}else if(A[i]<min2){
min2=A[i];
}
if(A[i]>max1){
max3=max2;
max2=max1;
max1=A[i];
}else if(A[i]>max2){
max3=max2;
max2=A[i];
}else if(A[i]>max3){
max3=A[i];
}
}
return max((long long)min1*min2*max1,(long long)max1*max2*max3);
}
};