1. 题目

2. 题意
题意较为容易理解,即有一个找出重复数。
3. 思路
如果可以使用其他额外空间的话,可以直接用另外一个数组进行记录,或者使用HashMap来记录各个数值出现的次数,但该题目要求只能使用额外O(1)的空间,所以我们应该考虑如何通过修改原有数组的值来记录数值出现的次数。
第一种思路可以直接进行排序,最终遍历排序结果,看哪个数值有两个相同的值相邻,即为重复的值。
第二种思路,由于数字有n+1个,数值又是从1~n,我们可以考虑将数值放置到与下标对应的位子上,如果出现两个数值需放到同一个下标处,则该两个数值必定相同,必定为重复数。
举例说明:比如现在数组为[1,2,1],我们可以考虑将数值为i的数,放置到下标为i-1的位置上,所以1和1需要放置到下标为0的位置上,2需要放置到下标为1的放置上,因此出现了两个数值需放到同一个下标处,找到重复数。
4. 解题代码
public int findDuplicate(int[] nums) {
int duplicateNum = 0;
for (int i = 0; i < nums.length; i++) {
// 数字已放置在对应的下标处,value为 i 放置在 i - 1 的下标处
if (nums[i] == i + 1) {
continue;
}
// temp 为该数字应放置下标处的值
int temp = nums[nums[i] - 1];
// 如果出现两个相同的数需要放入到同一个下标处,则该数为重复数
if (temp == nums[i]) {
duplicateNum = temp;
break;
}
// 交换两数,继续从该下标处往后遍历
nums[nums[i] - 1] = nums[i];
nums[i] = temp;
i--;
}
return duplicateNum;
}
5. 运行结果

本文介绍了一种在不使用额外空间的情况下查找数组中重复数字的算法。通过将数字放置在其对应下标位置,若发现两个数需占用同一位置,则找到重复数。文章提供了详细的解题思路与代码实现。
3048

被折叠的 条评论
为什么被折叠?



