三個數的最大乘積
1、三個數的最大乘積
本題來源於:628. 三個數的最大乘積
難度easy。
給定一個整型數組,在數組中找出由三個數組成的最大乘積,並輸出這個乘積。
示例 1:
輸入: [1,2,3]
輸出: 6
示例 2:
輸入: [1,2,3,4]
輸出: 24
注意:
給定的整型數組長度範圍是[3,104],數組中所有的元素範圍是[-1000, 1000]。
輸入的數組中任意三個數的乘積不會超出32位有符號整數的範圍。
題目很好理解,就是求數組中三個數乘積的最大值,我們找到最小的兩個數與最大一位數的乘積,與最大的三位數的乘積相比,選最大的元素即可。
於是問題變爲選取TopK的問題,當然,我們可以用堆解決這個問題,建立一個容量爲2的最小堆,與容量爲3 的最大堆(都是小頂堆),即可解決這個問題。不過,鑑於需要選取元素數量極少,使用高級數據結構有點殺雞用牛刀的感覺。
於是我們可以手動求最大的和最小的幾位元素。
public int maximumProduct(int[] nums) {
int min1=Integer.MAX_VALUE,min2=Integer.MAX_VALUE;
int max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;
for(int n:nums){
if(n<=min1){
min2=min1;
min1=n;
}else if(n<=min2){
min2=n;
}
if(n>=max1){
max3=max2;
max2=max1;
max1=n;
}else if(n>=max2){
max3=max2;
max2=n;
}else if(n>max3){
max3=n;
}
}
return Math.max(min1*min2*max1,max1*max2*max3);
}
2、求最大的三個數
本題是面字節的時候,給出的一道題,常規的解法有堆法和快速選擇法,缺點在於寫法複雜(其實也不復雜…)。我當時給出的解法類似於下面的解法。
//求最大的3個元素
public int[] top3(int[] nums){
int max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,max3=Integer.MIN_VALUE;
for(int n:nums){
if(n>=max1){
max3=max2;
max2=max1;
max1=n;
}else if(n>=max2){
max3=max2;
max2=n;
}else if(n>max3){
max3=n;
}
}
int[] result={max3,max2,max1};
return result;
}