题目描述
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
我的解法
排序
先排序,在找
性能不好
数组记录
用数据记录出现的次数
空间换时间
public int findRepeatNumber(int[] nums) {
byte arr[] = new byte[nums.length];
for(int n: nums){
if(arr[n]==1)return n;
arr[n]=0b1;
}
return -1;
}
时间击败90%
时间复杂度:O(N)
空间复杂度:O(N)
其他解法
这个方法很精妙
若没有重复,排序后元素nums[i]出现在的第i个
现在有重复,且没有排序,
遍历,判断num[i]是不是第i个,不是则交换,同时在途中判断是否有重复
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;
}
算法是很巧妙
随着遍历进行,数组越来越有序,直到碰到第一个重复的数
性能很好,击败100%
时间复杂度O(N)
空间复杂度O(1)
其他还有些解法,什么HashMap,感觉都没什么特色,想要时间换空间,使用数组比map更直接。