1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或 3
限制:
2 <= n <= 100000
|
哈希表(set)
hashset中数组的唯一性,当hash表中不能在添加的时候,表示有重复数据,返回
1 2 3 4 5 6 7 8 9 10 11 12 13
|
public static int findRepeatNumberV1(int[] nums) { Set<Integer> integers = new HashSet<>(); for (int num : nums) { if (!integers.add(num)) { return num; } } return -1; }
|
原地交换
这个是针对本题目的特殊性
nums 里的所有数字都在 0~n-1
也就是说,所有的数字在数组中都能找到他以该数组为索引的位置,而不会造成数组下标越界,所以可以建立索引和值得映射
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public static int findRepeatNumberV2(int[] nums) { for (int i = 0; i < nums.length; ) { if (nums[i] == i) { i++; continue; } if (nums[i] == nums[nums[i]]) { return nums[i]; } int temp = nums[i]; nums[i] = nums[temp]; nums[temp] = temp; } return -1; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public static int findRepeatNumberV3(int[] nums) { int temp = 0;
for (int i = 0; i < nums.length; i++) { while (i != nums[i]){ if(nums[i] == nums[nums[i]]){ return nums[i]; } temp = nums[i]; nums[i] = nums[temp]; nums[temp] = temp; } }
return -1; }
|
博客首先发布:
https://lvxiaoyi.top/