/**
* 自己的代码1
* 先便利一遍将所有出现的数字为下标的数组元素都加上nums.length
* 再遍历一次找大于2 * nums.length的元素,返回其下标
* Runtime: 4 ms, faster than 33.20%
* Memory Usage: 56.4 MB, less than 23.85%
*/
class Solution {
public int findDuplicate(int[] nums) {
for (int i : nums) {
nums[i % nums.length] += nums.length;
}
for (int i = 1; i < nums.length; i++) {
if (nums[i] > 2 * nums.length) {
return i;
}
}
return -1;
}
}
/**
* 自己的代码2
* 和前一段一样的做法,只是合并为了一个循环,在给每个元素加nums.length后马上判断是否超过2 * nums.length,是的话就直接return下标
* Runtime: 4 ms, faster than 33.20%
* Memory Usage: 56.9 MB, less than 10.73%
*/
class Solution {
public int findDuplicate(int[] nums) {
for (int i = 0; i < nums.length; i++) {
int temp = nums[i] % nums.length;
nums[temp] += nums.length;
if (nums[temp] > 2 * nums.length) {
return temp;
}
}
return -1;
}
}
/**
* 2021.7.11再做,自己的代码
* 和上一段差不多,只是先判断了nums[idx] >= len,可以省去满足条件的那一次的nums[idx] += len操作
* Runtime: 4 ms, faster than 86.66%
* Memory Usage: 56.6 MB, less than 57.35%
*/
class Solution {
public int findDuplicate(int[] nums) {
int len = nums.length;
for (int i = 0; i < len; i++) {
int idx = nums[i] % len;
if (nums[idx] >= len) {
return idx;
}
nums[idx] += len;
}
return -1;
}
}