//题目说了数组含有正数负数和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; }