描述:給定數組中求第三大的數字;若是沒有,返回最大的;時間複雜度O(n)java
記得《劍指offer》纔看到過這樣的求第k大的題目。可是忘記具體怎麼作了。只好先本身想了。數組
由於時間複雜度的限制,因此不能用排序,考慮聲明3個空間,用於保存前三大的數字。code
因爲考慮不仔細,想着直接把三個空間初始化爲N[0],而後從1開始遍歷,發現可能直接輸出第一個數字,儘管它不是第三大的。排序
因此應該初始化爲Integer.MIN_VALUE
io
剛開始沒有認真理解好題目,「若是沒有」也包括像[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