【Leetcode】1133. Largest Unique Number

题目地址:

https://leetcode.com/problems/largest-unique-number/

给定一个数组,求其最大的且只出现了一次的那个数。

可以先排序,然后从最大数开始遍历起,并且维持指针指向每个数字第一次出现的位置。如果发现 A [ i ] ≠ A [ i − 1 ] A[i]\ne A[i-1] A[i]=A[i1],则已经发现了最大且唯一的数字,直接返回 A [ i ] A[i] A[i];否则说明出现了连续的数,则移动指针,直到移动到了 0 0 0或者中途发现了 A [ i ] ≠ A [ i − 1 ] A[i]\ne A[i-1] A[i]=A[i1],如果移动到了 0 0 0说明没有唯一的数字,返回 − 1 -1 1,否则把 i i i移动到下一个不同的数字第一个出现的位置,接着继续遍历。代码如下:

import java.util.Arrays;

public class Solution {
    public int largestUniqueNumber(int[] A) {
        if (A == null || A.length == 0) {
            return -1;
        }
        
        Arrays.sort(A);
        int i = A.length - 1;
        while (i >= 1) {
            if (A[i] != A[i - 1]) {
                return A[i];
            } else {
                while (i >= 1 && A[i] == A[i - 1]) {
                    i--;
                }
                // 如果一路i到了0,说明所有数字都出现了超过1次,则返回-1
                if (i == 0) {
                    return -1;
                }
                // 否则将i再移动一步到下一个不同数字上去
                i--;
            }
        }
        // 如果A里满足条件的数出现在下标大于0的位置,那么上面的while循环一定能发现;
        // 如果A不存在满足条件的数,上面while循环会返回-1;
        // 否则的话,只能是A[0]是答案
        return A[0];
    }
}

时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn),空间 O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值