题目地址:
https://leetcode.com/problems/largest-unique-number/
给定一个数组,求其最大的且只出现了一次的那个数。
可以先排序,然后从最大数开始遍历起,并且维持指针指向每个数字第一次出现的位置。如果发现 A [ i ] ≠ A [ i − 1 ] A[i]\ne A[i-1] A[i]=A[i−1],则已经发现了最大且唯一的数字,直接返回 A [ i ] A[i] A[i];否则说明出现了连续的数,则移动指针,直到移动到了 0 0 0或者中途发现了 A [ i ] ≠ A [ i − 1 ] A[i]\ne A[i-1] A[i]=A[i−1],如果移动到了 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)。