剑指 Offer 03. 数组中重复的数字
题解
排序后相邻比较
将数组进行排序之后相邻元素进行比较即可。
时间复杂度:O(n\(log_n\))
空间复杂度:O(1)
class Solution {
public int findRepeatNumber(int[] nums) {
Arrays.sort(nums);
for(int i = 1; i < nums.length; ++ i){
if(nums[i] == nums[i - 1]) return nums[i];
}
return -1;
}
}
哈希
直接遍历一遍数组,如果遇到重复的数字直接返回就可以了,如果不存在返回-1,只需要在遍历的过程中使用一个集合存储我们遇到过的数字,方便后续判定
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public int findRepeatNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for(int item : nums){
if(!set.add(item)){
return item;
}
}
return -1;
}
}
原地哈希
在题目中说明了数组中的数据小于数组的长度,我们可以使用原地哈希的方式进行判重处理,我们将每一个元素nums[i]放置到对应的nums[i]的下标位置,即交换nums[i]和nums[nums[i]]的值,如果处理中发现nums[i]等于nums[nums[i]],说明重复了,返回重复的值即可。这种方式是利用原有的数组空间为哈希表进行处理,节约了空间。
时间复杂度:O(n)
空间复杂度:O(1)
class Solution {
public int findRepeatNumber(int[] nums) {
for(int i = 0; i < nums.length; ){
if(nums[i] == i) {
i ++;
continue;
}
if(nums[nums[i]] == nums[i]) return nums[i];
int temp = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = temp;
}
return -1;
}
}
如有错误,欢迎指正!