3つの数字の最大積
1.3つの数字の最大積
この質問は次のとおりです。628。3つの数値の最大積
難易度は簡単です。
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入: [1,2,3]
输出: 6
示例 2:
输入: [1,2,3,4]
输出: 24
注意:
给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
問題はわかりやすいです。配列内の3つの数字の積の最大値を見つけることです。最小の2つの数字と最大の1桁の積を見つけます。最大の3桁の積と比較して、最大の要素を選択します。
したがって、問題は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つの数字を見つけます
この質問は、フェイスバイトの場合の質問です。従来の解決策は、ヒープ方式とクイックセレクション方式がありますが、書き込み方式が複雑(実は複雑ではない…)というデメリットがあります。私が与えた解決策は、以下の解決策と同様でした。
//求最大的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;
}