
思路:
1、数组中全部是正数或者是负数,找出数组中最大的三个数的乘积即可
2、数组中既有正数,又有负数,那么是最大乘积的可能性是下面两种情况:
最大的数第二大的数第三大的数
最小的数第二最小的数最大的数
public class MaxProduct {public static void main(String[] args) {System.out.println(sort(new int[]{1,2,3,4,5}));}private static int sort(int[] arr) {// 利用系统自带的排序方法,算法复杂度是O(nlogn)Arrays.sort(arr);int length = arr.length;if (length < 3) {return -1;}return Math.max(arr[0]*arr[1]*arr[length-1], arr[length-1]*arr[length-2]*arr[length-3]);}}
public class MaxProduct {
public static void main(String[] args) {
System.out.println(getMaxMin(new int[]{1,2,3,4,5}));
}
private static int getMaxMin(int[] arr) {
int length = arr.length;
if (length < 3) {
return -1;
}
// 定义两个最小数的变量,三个最大数的变量
int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
// 循环找出数组中最小的两个数和最大的三个数
for (int i : arr) {
if (i < min1) {
// 如果这个数小于最小的数,那么将最小数变量赋值给第二最小数变量,这个数赋值给最小数变量
min2 = min1;
min1 = i;
} else if (i < min2) {
// 如果这个数小于第二最小的数,那么将这个数赋值给第二最小数变量
min2 = i;
}
if (i > max1) {
// 如果这个数大于最大的数,那么将第二大数赋值给第三大数变量,最大数赋值给第二大数变量,这个数赋值给最大数变量
max3 = max2;
max2 = max1;
max1 = i;
} else if (i > max2) {
// 如果这个数大于第二大数,那么将第二大数赋值给第三大数变量,这个数赋值给第二大数变量
max3 = max2;
max2 = i;
} else if (i > max3) {
// 如果这个数大于第三大数,那么将这个数赋值给第三大数变量
max3 = i;
}
}
// 通过上面的一个循环就找出来了,最大的数,第二大的数,第三大的数,最小的数,第二最小的数
return Math.max(min1*min2*max1, max1*max2*max3);
}
}
