因为数组里所有的数大小都在1~n之间,所有我们可以建立一种映射:当我们访问到a[i]时,我们把index为 a[i] - 1(亦即第a[i]个)的数取反。因此当我们第二次遇到a[i]的时候,对应index的数已经是负数了。这时候我们就把 a[i] = index + 1加入到List当中。代码如下:
class Solution {
public List<Integer> findDuplicates(int[] nums) {
List<Integer> res = new ArrayList<>();
for(int i = 0; i < nums.length; i++){
int index = Math.abs(nums[i]) - 1;
if(nums[index] < 0){
res.add(index + 1);
}
nums[index] = - nums[index];
}
return res;
}
}