//题目说了数组含有正数负数和0,那么最小的那个数必定是负数,最大的那个数必定是正数
//要想三个数的乘积最大,那么要么取三个最大的正数相乘,要么取两个最小的负数和最大的正数相乘
//第一步:通过一趟遍历,将找到第一大第二大第三大的三个数和第一小第二小的两个数
//第二步:比较两种情况下三个数的乘积,看哪个更大就返回哪个
long long solve(int* A, int ALen ) {
int minmin= 10001, maxmax = -10001; //就是走过场,设最小其实最大,设最大其实最小,就是给机会让你更新
//因为题目给了数据的范围,为了方便就假设最值刚好超过边界,而不是设整型的最值边界
int max1 = maxmax, max2 = maxmax, max3 = maxmax;
int min1 = minmin, min2 = minmin;
// min1 < min2 <…… < max1 < max2 < max3
for(int i = 0;i < ALen;i ++){ //只有当A[i]出现在两种位置时才会更新min
if(A[i] < min1){//更新最小值
min2 = min1;
min1 = A[i];
}
else if(A[i] < min2){//更新第二小
min2 = A[i];
}
if (A[i] > max1){//当A[I]出现在三种地方时需要更新max
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];
}
}
if((long long)min1 * min2 * max1 > (long long) max1 * max2 * max3)
return (long long)min1 * min2 * max1;
else
return (long long) max1 * max2 * max3;
}