描述:给定数组中求第三大的数字;若是没有,返回最大的;时间复杂度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