//最大三个数乘积
public static void main13(String[] args) {
int[] a = {-1,-2,-3,4};
int b = maxThree(a);
int c = maxThree1(a);
System.out.println(b);
System.out.println(c);
}
public static int maxThree(int[] nums){
int temp = 0;
for(int i = 0;i < nums.length;i++){
for(int j = i+1;j < nums.length;j++){
if(nums[i] < nums[j]){
temp = nums[j];
nums[j] = nums[i];
nums [i] = temp;
}
}
}
//如果排序后全是正数则最大值就是前三个数的乘积,如果有负数则:如果前三个数存在两正一负或者一正两负,
// 那么最大值是最小的两个负数与最大正数的乘积;如果前三个数都是负数那么最大值就是前三个数乘积。
//即:最大乘积要么就是前三个数相乘,要么就是第一个数与后两个数相乘;比较二者最大值即可。
int ret = Math.max((nums[0] * nums[1] * nums[2]),(nums[nums.length-1] * nums[nums.length-2]*nums[0]));
return ret;
}
解题的关键在于排序和最大的乘积分析;排序简单,初学者可以用冒泡排序,也可以用Array.sort()排序。排完后就是找出乘积最大的三个数。
我们分两种情况看:1.全是正数,最大乘积就是前三个数的乘积(从大到小排)。2.如果存在负数呢?前三个数没有负数那么最大乘积依然是前三个数;前三个数有一个负数最大乘积是最大的正数和最小的两个负数的乘积是最大的;前三个数有两个负数乘积依然是最大的正数和最小的两个负数的乘积是最大的;前三个数都是负数也就是说全是负数,那么最大乘积就是前三个数的乘积。
总结:无论如何,最大乘积必然在前三个数的乘积和第一个数最后两个数乘积之间产生。