算法-三個數的最大乘積(K很小時的TopK問題)

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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章