题目描述(题目链接)
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 :
输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
方法1
遍历数组,用数组set保存每个数字的个数,当大于1时,直接返回当前数字。
代码1
执行用时:1 ms, 在所有 Java 提交中击败了83.65%的用户 内存消耗:46.1 MB, 在所有 Java提交中击败了78.98%的用户
class Solution {
public int findRepeatNumber(int[] nums) {
int[] set = new int[nums.length];
for(int i=0;i<nums.length;i++){
set[i]=0;
}
for(int i=0;i<nums.length;i++){
set[nums[i]]++;
if(set[nums[i]]>1){
return nums[i];
}
}
return -1;
}
}
方法2
不使用额外的空间
遍历数组,通过交换数字,使得nums[i]=i,若在交换时,发现有重复数字,则返回当前数字
代码2
执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户 内存消耗:45.9 MB, 在所有 Java提交中击败了90.66%的用户
class Solution {
public int findRepeatNumber(int[] nums) {
int temp;
for(int i=0;i<nums.length;i++){
while (nums[i]!=i){
if(nums[i]==nums[nums[i]]){ //重复
return nums[i];
}
temp=nums[i]; //交换
nums[i]=nums[temp];
nums[temp]=temp;
}
}
return -1;
}
}