问题描述:
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入: [1,2,3]
输出: 6
示例 2:
输入: [1,2,3,4]
输出: 24
注意:
- 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
- 输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
解题思路:
- 先对给定数组进行排序,我采取降序排序。
- 此时分为以下几种情况:
- 排序后的第一个元素小于等于0,或者最后一个元素大于等0,此时三个乘积最大应该是前三个元素的乘积。
- 排序后的第二个元素小于等于0,或第三个个元素小于等于零,此时三个乘积最大应该是第一个和最后两个元素的乘积。
- 排序后的最后两个元素都为负数,并且乘积大于第二个和第三个元素的乘积,此时三个乘积最大应该是第一个和最后两个元素的乘积。
- 除了以上情况,其他情况的最大乘积均是排序后的前三个元素的乘积。
实现过程:
public static int maximumProduct(int[] nums) {
int n = nums.length;
if (n < 3) {
return 0;
}else if (n == 3) {
return (nums[0]*nums[1]*nums[2]);
}else {
shellSort(nums);
if (nums[0] <= 0 || nums[n-1] >= 0) {
return (nums[0]*nums[1]*nums[2]);
}else if (nums[1] <= 0 || nums[2] <= 0) {
return (nums[0]*nums[n-1]*nums[n-2]);
}else {
if (nums[n-1]*nums[n-2] > nums[1]*nums[2]) {
return (nums[0]*nums[n-1]*nums[n-2]);
}else {
return (nums[0]*nums[1]*nums[2]);
}
}
}
}
public static void shellSort(int[] arr) { //shell排序法
int n = arr.length;
if (n <= 1) {
return;
}
for (int i = n/2; i >= 1; i /= 2) {
for (int j = i; j < n; j++) {
int value = arr[j];
int k = j - i;
while (k >= 0) {
if (value > arr[k]) {
arr[k+i] = arr[k];
k -= i;
}else {
break;
}
}
arr[k+i] = value;
}
}
}