628.三个数的最大乘积
思路一:排序
鉴于我们的数字中存在负数,所以三个数字最大乘积只可能有2种情况。
- 最后三个正数
- 最小的两个负数和最后一个最大的正数
class Solution {
public int maximumProduct(int[] nums) {
Arrays.sort(nums);
if(nums[0]<0 && nums[1]<0)
return Math.max(nums[nums.length-1]*nums[nums.length-2]*nums[nums.length-3],nums[0]*nums[1]*nums[nums.length-1]);
else
return nums[nums.length-1]*nums[nums.length-2]*nums[nums.length-3];
}
}
思路二:线性扫描
实际上我们用到的只是最大的三个数和最小的两个数
class Solution {
public int maximumProduct(int[] nums) {
int min1=Integer.MAX_VALUE,min2=Integer.MAX_VALUE; // min1 < min2
int max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE; // max1<max2<max3
for(int i=0;i<nums.length;i++){
if(nums[i]<min1){
min2 = min1;
min1 = nums[i];
}
else if(nums[i]<min2){
min2 = nums[i];
}
// 两个if的原因是因为一个元素同时可能出现在min1和max1
if(nums[i]>max3){
max1 = max2;
max2 = max3;
max3 = nums[i];
}
else if(nums[i]>max2){
max1 = max2;
max2 = nums[i];
}
else if(nums[i]>max1){
max1 = nums[i];
}
}
// System.out.println(min1+" "+min2+" "+max1+" "+max2+" "+max3+" ");
return Math.max(min1*min2*max3,max1*max2*max3);
}
}