leetcode题解-414. Third Maximum Number

题目:

Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n).

Example 1:
Input: [3, 2, 1]

Output: 1

Explanation: The third maximum is 1.
Example 2:
Input: [1, 2]

Output: 2

Explanation: The third maximum does not exist, so the maximum (2) is returned instead.
Example 3:
Input: [2, 2, 3, 1]

Output: 1

Explanation: Note that the third maximum here means the third maximum distinct number.
Both numbers with value 2 are both considered as second maximum.

本题是要寻找数组中第三大的数,我们的第一种思路就是使用三个数来保存最大的三个数,便利数组的同时进行修改即可。代码入下:

    public int thirdMax1(int[] nums){
        Integer max1 = null;
        Integer max2 = null;
        Integer max3 = null;
        for (Integer n : nums) {
            if (n.equals(max1) || n.equals(max2) || n.equals(max3)) continue;
            if (max1 == null || n > max1) {
                max3 = max2;
                max2 = max1;
                max1 = n;
            } else if (max2 == null || n > max2) {
                max3 = max2;
                max2 = n;
            } else if (max3 == null || n > max3) {
                max3 = n;
            }
        }
        return max3 == null ? max1 : max3;
    }

此外,我们还可以使用一个变量来保存数字,一个变量来表示当前保存的是第几大的数字。首先将数组进行排序,然后从数组的最后开始遍历,即从最大的数字开始遍历。代码入下:

    public int thirdMax(int[] nums) {
        int res=Integer.MIN_VALUE, count=0;
        Arrays.sort(nums);
        for(int i=nums.length-1; i>=0; i--){
            if(res != nums[i]){
                res = nums[i];
                count++;
                if(count == 3)
                    break;
            }
        }
        if(count<3)
            return nums[nums.length-1];
        return res;
    }

这两种方法思路差不多,效率也很相近。此外我还看到一种使用priorityQueue的方法,使用优先级队列来保存最大的三个数字。但是因为其本身效率很低,所以代码耗时较长。代码入下:

    public int thirdMax2(int [] nums){
        PriorityQueue<Integer> pq = new PriorityQueue<>();
        Set<Integer> set = new HashSet<>();
        for(int num : nums){
            if(!set.contains(num)){
                pq.offer(num);
                set.add(num);
                if(pq.size() > 3)
                    set.remove(pq.poll());
            }
        }
        if(pq.size()<3)
            while(pq.size()>1)
                pq.poll();
        return pq.peek();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值