查找吧?
1、因为题目要求是On的时间,所以排序肯定是不行的。、
2、所以,重复的数字,都是同一个位置,所以可以去重。比存在的且不同的数字即可。
3、用一个大小为3的堆来比吗?
好像就是topK问题
public static int thirdMax(int[] nums) { //去重 Set<Integer> set = new HashSet<>(); for(int i=0;i<nums.length;i++){ set.add(nums[i]); } Iterator<Integer> iterator = set.iterator(); int count = 0; PriorityQueue<Integer> queue = new PriorityQueue<>(); //把数字都遍历一次,如果比queue里最小的元素大,就删掉queue里最小的元素,扔进queue //这样到最后,queue里面的元素,肯定都是比这些元素大的,这就是topK了 while(iterator.hasNext()){ int temp = iterator.next(); if(count<3){ queue.add(temp); count++; }else{ if(temp>queue.peek()){ queue.poll(); queue.add(temp); } } } //麻烦一点,这样语意明确 if(queue.size()>=3){ return queue.poll(); }else if (queue.size()==2){ queue.poll(); return queue.poll(); }else { return queue.poll(); } }
答案里面,排序的运行时间好快
最快的答案,不可取,一个个比较,如果K变多了呢?