持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
题目描述
给你一个整数数组 nums ,该数组具有以下属性:
nums.length == 2 * n.nums包含n + 1个 不同的 元素nums中恰有一个元素重复n次 找出并返回重复了n次的那个元素。
示例
输入: nums = [1,2,3,3]
输出: 3
输入: nums = [2,1,2,5,3,2]
输出: 2
输入: nums = [5,1,5,2,5,3,5,4]
输出: 5
提示
2 <= n <= 5000nums.length == 2 * n0 <= nums[i] <= 10nums由n + 1个 不同的 元素组成,且其中一个元素恰好重复n次
哈希表
提示中说明了目标数组中仅有一个元素是重复的,其余元素均不相同,那么我们就可以才用哈希表的特性,将出现过的元素存入集合中缓存起来,用于后续重复元素的判断,当后续遇上了重复的元素,则直接返回该元素即可。
class Solution {
public int repeatedNTimes(int[] nums) {
// 缓存出现过的元素
Set<Integer> set = new HashSet<>();
// 遍历目标数组
for(int num : nums){
// 存入缓存集合
if(!set.add(num)){
// 保存失败表示该元素已存在,直接返回结果
return num;
}
}
return nums[0];
}
}
随机数
由于重复的数量为n,占据了目标数组的一般,那么我们有50%的概率能得到该元素,这里我们可以使用随机数来得到任意的两个索引,进行判断,当两个不同位置的元素相等时,则表示找到结果。
class Solution {
public int repeatedNTimes(int[] nums) {
int n = nums.length;
Random random = new Random();
while (true) {
// 随机获取两位数,比较是否相等,相等则返回结果
int x = random.nextInt(n), y = random.nextInt(n);
if (x != y && nums[x] == nums[y]) {
// 匹配目标,返回结果
return nums[x];
}
}
}
}