1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int largestUniqueNumber(int[] nums) {
int max = -1;
Arrays.sort(nums);
for (int i = nums.length - 1; i >= 0; i--) {
if (i == 0 || nums[i] != nums[i - 1]) {
return nums[i];
}
while (i > 0 && nums[i] == nums[i - 1]) {
i -= 1;
}
}
return -1;
}
}

这个解法还挺有意思. 先sort一下, 然后从后往前遍历, 因为我们是找最大的. 如果是找最小的, 我们就从前往后遍历即可. 如果nums[i] == nums[i - 1], 那么这个nums[i]对应的数字就不行, 我们就用个循环把等于nums[i]的数字全部跳过. 等到到了一个位置发现nums[i] != nums[i - 1]的时候. 我们就可以停了, 此时nums[i - 1]就是一个新的数字. 由于我们使用nums[i - 1], 我们必须保证i - 1不能出界. 因此开始在判断nums[i - 1]等不等于nums[i]的时候, 我们要加一个条件就是i要大于0. 同样我们跳过相同数字的时候, 也要保证i大于0. 因此我们就在想, 如果跳过相同数字的时候, 刚好连续到了i == 0处, 那么我们会停止循环, 然后i–, 此时外侧for循环就不会再继续. 如果没有到i == 0处, 我们i–, 此时的位置就是下一个新数字的位置. 此时如果i == 0了, 因为它前面没数字了, 因此i == 0处的数字就是max, 如果此时的i > 0, 我们继续看它之前有没有重复数字, 这就是第6行的来历. 等于是先确定怎么跳过重复数字, 再看while结束时, i的位置, 然后根据不同情况判断下一步怎么做. 这个挺有意思的.

时间复杂度: O(nlogn)
空间复杂度: O(logn)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int largestUniqueNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
int max = -1;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
if (entry.getValue() == 1) {
max = Math.max(max, entry.getKey());
}
}
return max;
}
}

第二种方法就是HashMap, 很常规.

时间复杂度: O(n)
空间复杂度: O(n)