442. 数组中重复的数据

这一题就是要求的长度是n,数组长度也是n,因此可以在原数组上进行交换来达成目标。
这也就是原地hash的思路。
image.png
难点在于两个地方:

  1. 将遍历到的数,放到对应下标的位置时,如果原本这个下标存在一个没有访问过的数怎么处理?
  2. 如果不需要放到对应的下标位置时,其他的数可能会放过来,那么这个数怎么办?
    1. public List<Integer> findDuplicates(int[] nums) {
    2. List<Integer> ans = new ArrayList<>();
    3. int n = nums.length;
    4. for (int i = 0; i < n; i++) {
    5. int t = nums[i];
    6. if (t < 0 || t - 1 == i) continue;
    7. if (nums[t - 1] == t) {
    8. ans.add(t);
    9. nums[i] *= -1;
    10. } else {
    11. // 注意这里,交换之后重新在进行一次查询
    12. int c = nums[t - 1];
    13. nums[t - 1] = t;
    14. nums[i--] = c; // i --了
    15. }
    16. }
    17. return ans;
    18. }