下标循环怼

  • 做到数组中i位置躺着的数是 i + 1

image.png
image.png
image.png
image.png
image.png
image.png
此时1位置已经躺着个2了,停, i++。。。直到4位置。
此刻7位置已经躺着个8了,停,i++。。。直到6位置

image.png
image.png
image.png
所以此时就可以看出缺少了5和7

  1. public List<Integer> findDisappearedNumbers(int[] nums) {
  2. List<Integer> ans = new ArrayList<>();
  3. int i = 0;
  4. while (i < nums.length) {
  5. int next = nums[i] - 1;
  6. if (nums[next] != next + 1) {
  7. int tmp = nums[i];
  8. nums[i] = nums[next];
  9. nums[next] = tmp;
  10. } else {
  11. i++;
  12. }
  13. }
  14. for (int j = 0; j < nums.length; j++) {
  15. if (nums[j] != j + 1) {
  16. ans.add(j + 1);
  17. }
  18. }
  19. return ans;
  20. }