442. 数组中重复的数据
这一题就是要求的长度是n,数组长度也是n,因此可以在原数组上进行交换来达成目标。
这也就是原地hash的思路。
难点在于两个地方:
- 将遍历到的数,放到对应下标的位置时,如果原本这个下标存在一个没有访问过的数怎么处理?
- 如果不需要放到对应的下标位置时,其他的数可能会放过来,那么这个数怎么办?
public List<Integer> findDuplicates(int[] nums) {List<Integer> ans = new ArrayList<>();int n = nums.length;for (int i = 0; i < n; i++) {int t = nums[i];if (t < 0 || t - 1 == i) continue;if (nums[t - 1] == t) {ans.add(t);nums[i] *= -1;} else {// 注意这里,交换之后重新在进行一次查询int c = nums[t - 1];nums[t - 1] = t;nums[i--] = c; // i --了}}return ans;}
