アルゴリズム-3つの数値の最大積(小さいKのTopK問題)

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;
    }

おすすめ

転載: blog.csdn.net/qq_23594799/article/details/105938721