LeetCode 第三大的數414. Third Maximum Number

題目

描述:給定數組中求第三大的數字;若是沒有,返回最大的;時間複雜度O(n)java

記得《劍指offer》纔看到過這樣的求第k大的題目。可是忘記具體怎麼作了。只好先本身想了。數組

由於時間複雜度的限制,因此不能用排序,考慮聲明3個空間,用於保存前三大的數字。code

錯誤

三個空間初始化爲N[0]

因爲考慮不仔細,想着直接把三個空間初始化爲N[0],而後從1開始遍歷,發現可能直接輸出第一個數字,儘管它不是第三大的。排序

因此應該初始化爲Integer.MIN_VALUEio

理解錯題目

剛開始沒有認真理解好題目,「若是沒有」也包括像[1,2,1]這樣的雖然個數有三個,可是並無第三大的數字。若是按照原來的想法,則輸入[1,1,2]會輸出-2147483648。而此時應該輸出最大值class

解決:經過HashSet去重,獲得「真正的個數」遍歷

粗心

輸入[1,1,2]會輸出1(應該是最大值2),儘管前面個數的判斷改了,可是隻有兩個時候返回仍然是(nums[0]>nums[1]?nums[0]:nums[1]);
經過修改,將HashSet又從新保存回數組,再來比較:(newNums[0]>newNums[1]?newNums[0]:newNums[1]);時間

最終代碼

public class Solution {
    public int thirdMax(int[] nums) {
        HashSet<Integer> integers=new HashSet<>();
        for (Integer integer : nums) {
            integers.add(integer);
        }
        int[] newNums=new int[integers.size()];
        int  i=0;
        for (Integer integer : integers) {
            newNums[i]=integer;
            i++;
        }
        if(integers.size()==1)
            return newNums[0];
        else if (integers.size()==2) {
            return (newNums[0]>newNums[1]?newNums[0]:newNums[1]);
        }else {
            //聲明一個大小爲3的數組,保留原數組的最大的三個,並且維護從小到大的排序
            int first=Integer.MIN_VALUE,second=Integer.MIN_VALUE,third=Integer.MIN_VALUE;
            for (i = 0; i < newNums.length; i++) {
                int curInt = newNums[i];
                if(first<curInt&&second>curInt){
                    first=curInt;
                }else if (curInt>second&&curInt<third) {
                    first=second;
                    second=curInt;
                }else if (curInt>third) {
                    first=second;
                    second=third;
                    third=curInt;
                }
            }
            return first;
        }
    }
}

結果分析

最後只戰勝了20%+的java,估計仍是前面HashSet去重可能用的時間有點多了。回頭再想一個好一點的去重的辦法!co

相關文章
相關標籤/搜索