题目描述
难度: 简单
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入: [2, 3, 1, 0, 2, 5, 3]
输出: 2 或 3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof
思路 1
思路
Java中的集合(HashSet)类可以用于存储不重复的对象。遍历数组,若第一次出现,则添加于集合中,否则返回该项。
代码
class Solution {
public int findRepeatNumber(int[] nums) {
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
if (set.contains(nums[i])) {
return nums[i];
} else {
set.add(nums[i]);
}
}
return -1;
}
}
执行结果
思路 2
思路
数组 nums 里的所有数字都在 0~n-1 的范围内,故可以构造一个大小为n的Boolean数组存储信息,默认为false。遍历数组,若对应的Boolean数组项为false,修改该项为true,否则返回该项。
代码
class Solution {
public int findRepeatNumber(int[] nums) {
int n = nums.length;
boolean[] flags = new boolean[n];
for (int i = 0; i < n; i++) {
if (flags[nums[i]] == true) {
return nums[i];
} else {
flags[nums[i]] = true;
}
}
return -1;
}
}
执行结果
思路 3
思路
如果原地进行排序来查找重复数字,则不需要额外空间(o(1))。
代码
class Solution {
public int findRepeatNumber(int[] nums) {
Arrays.sort(nums);
for (int i = 0; i < nums.length - 1; i++) {
if (nums[i] == nums[i + 1]) {
return nums[i];
}
}
return -1;
}
}
执行结果
写在最后
本系列博客仅记录转码过程中刷题时的解法。若有错误,欢迎交流与批评指正。官方解法请见力扣(LeetCode)官网。