T3: 数组中重复的数字
找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
限制:
2 <= n <= 100000
我的解法
class Solution {
public int findRepeatNumber(int[] nums) {
int a = -1;
bubbleSort(nums);
for(int i =0; i<bubbleSort(nums).length;i++){
if(bubbleSort(nums)[i]==bubbleSort(nums)[i+1]){
a = bubbleSort(nums)[i];
break;
}
}
return a;
}
public int[] bubbleSort(int[] arr){
for(int i = 0;i < arr.length;i++){
//比较两个相邻的元素
for(int j = 0;j < arr.length-i-1;j++){
if(arr[j] > arr[j+1]){
int t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
}
}
}
return arr;
}
}
超时了
他人解法 1 哈希集合
Set<Integer> set = new HashSet<Integer>();
int repeat = -1;
for (int num : nums) {
if (!set.add(num)) {
repeat = num;
break;
}
}
return repeat;
复杂性分析
时间复杂度:O(n)。
遍历数组一遍。使用哈希集合(HashSet),添加元素的时间复杂度为 O(1),故总的时间复杂度是 O(n)
空间复杂度:O(n)。不重复的每个元素都可能存入集合,因此占用 O(n) 额外空间。
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/mian-shi-ti-03-shu-zu-zhong-zhong-fu-de-shu-zi-b-4/
他人解法 2 原地置换
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;
}
}
执行用时:0 ms, 在所有 Java 提交中击败了**100.00%**的用户
内存消耗:45.8 MB, 在所有 Java 提交中击败了**96.58%**的用
如果没有重复数字,那么正常排序后,数字i应该在下标为i的位置,所以思路是重头扫描数组,遇到下标为i的数字如果不是i的话,(假设为m),那么我们就拿与下标m的数字交换。在交换过程中,如果有重复的数字发生,那么终止返回ture
作者:derrick_sun
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/yuan-di-zhi-huan-shi-jian-kong-jian-100-by-derrick/
这也是剑指offer的答案, 见第二版P40
他人解法 3 先排序
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;
}
}
作者:sdwwld
链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/solution/java-de-4chong-jie-fa-by-sdwwld/
学到
HashSet
https://blog.csdn.net/zhaojie181711/article/details/80480421
HashMap
https://blog.csdn.net/woshimaxiao1/article/details/83661464
HashMap面试
https://blog.csdn.net/qq_36711757/article/details/80394272
HashCode和Hash算法
https://blog.csdn.net/qq_33709582/article/details/113337405
数组几种排列