
1.排序
思路:
1.三个数都是整数或者都是负数:那么就排序,取大的前三个
2.两负一正:取排序后倒数两个负数,和取排序最大那个数相乘
3.两正一负:直接像第一种那样取前三大
public static int sortMethod(int[] array){
Arrays.sort(array);
int n = array.length;
//就是两种情况而已
return Math.max(array[0]*array[1]*array[n-1],array[n-1]*array[n-2]*array[n-3]);
}
2. 线性扫描(重点)
(还不太懂2021/8/19)
由于排序的时间复杂度一般都是N*logn,比较高,所以我们就不用排序,而是分析上面的,发现我们只需要用到上面的5个数就行:array[0]*array[1]*array[n-1],array[n-1]*array[n-2]*array[n-3],那我们就从这5个数下手:
public static int getMaxMin(int[] array){
//这里因为我们要判断每个数是否>或小,所以min1=Integer.MAX_VALUE就反过来,不是字面意思
//min1是最小,min2是倒数第二小
//max1是最大,max2是第二大
int min1=Integer.MAX_VALUE,min2=Integer.MAX_VALUE;
int max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;
for (int x : array) {
if (x<min1){
min2=min1;
min1=x;
}else if (x<min2){
min2=x;
}
if (x>max1){
max3=max2;
max2=max1;
max1=x;
}else if (x>max2){
max3=max2;
max2=x;
}else if(x>max3){
max3=x;
}
}
return Math.max(min1*min2*max1,max1*max2*max3);
}
这篇博客探讨了如何在不进行排序的情况下,通过线性扫描找到数组中三个数的最大乘积。作者提出了两种方法:一种是直接排序后取特定位置的数相乘;另一种是动态维护最大值、次大值、最小值和次小值,避免了排序的时间复杂度。这两种方法都针对数组中数字的正负情况进行了优化,旨在提高算法效率。
1400

被折叠的 条评论
为什么被折叠?



