找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
来源:力扣(LeetCode)
Note:
方法一:
此题需要注意的是:nums 里的所有数字都在 0~n-1 的范围内,抓住这一点就好解了。可以采用哈希表。
1.定义一个整型数组赋初值为-1
2.将数组nums中的值作为book[]数组的下标
3.遍历数组,如果book[num[i]] 初值为-1,则赋值为nums[i].
4.遍历数组是,如果book[num[i]] 初值不为-1,则表明之前出现过,直接返回。
C++:
class Solution {
public:
int findRepeatNumber(vector<int>& nums) {
int book[nums.size()];
memset(book,-1,sizeof(book));
for (int i = 0; i<nums.size(); i++){
if (book[nums[i]] == -1){
book[nums[i]] = nums[i];
}else{
return nums[i];
}
}
return -1;
}
};
return -1在函数末尾,是在没有任何一个数字重复的情况下返回-1。虽然题目中约定必有重复的数字,但是编译器要求必须在所有情况下都有返回值,不然会编译错误,所以就在末尾加上了这一句。
方法二:
一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内,利用下标,数值的范围与下标的范围一样。把数值当作下标,如果数值是第一次出现,就将数值变为负数。继续遍历数组时,如果对应的值是负数,则为重复数。
class Solution {
public int findRepeatNumber(int[] nums) {
for(int i = 0; i<nums.length; i++){
int index = Math.abs(nums[i]);
if(nums[index] < 0)
return index;
nums[index] *= -1;
}
return 0;
}
}
方法三:
利用Set集合。
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<Integer>();
for(int i:nums){
if(set.contains(i))
return i;
else set.add(i);
}
return 0;
}
}