题目描述:在一个长度为 n
的数组里的所有数字都在 0
到n-1
的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中第一个重复的数字。 例如,如果输入长度为 7
的数组 [2,3,1,0,2,5,3]
,那么对应的输出是第一个重复的数字 2
。没有重复的数字返回 -1
。
本篇重点针对下标法进行思路拓展:
通过不停的交换元素使得元素和它对应的下标相等,即nums[i] = i。(当元素是有重复的时候,肯定会出现多个元素对应同一个下标,那这个时候就可以判断该数组中是否有重复的元素),时间复杂度为O(n)
1、使用while循环用于判断数组中的元素值是否等于数组下标,如果元素值不等于下标值时,就要进行交换。
2、使用if条件语句用于交换前判断是否遇到重复的元素,如果是则直接返回。
3、交换操作,使元素置于自己下标所对应的位置上,即 i= nums[i]处。
Java代码如下:
public class Solution{
public repeatNumber(int[] nums){
for(int i = 0; i < nums.legnth; i++){
while(i != nums[i]){
if(nums[i] == nums[nums[i]]){
return nums[i];
}
int k = nums[nums[i]];
nums[nums[i]] = nums[i];
nums[i] = k;
}
}
return -1;
}
}