image.png

思路 索引作为哈希表。

数据预处理

image.png

就地算法

image.png
image.png

整体算法

image.png

code

  1. public int firstMissingPositive(int[] nums) {
  2. int n = nums.length;
  3. int contain1 = 0;
  4. //判断是否出现了1
  5. for(int i:nums){
  6. if(i==1){
  7. contain1++;
  8. break;
  9. }
  10. }
  11. //如果没有出现1 则最小正整数是1
  12. if(contain1==0)
  13. return 1;
  14. //如果出现了1且只有1 则返回2
  15. if(n==1)
  16. return 2;
  17. //将负数 0 大于n的数替换为1
  18. for(int i=0;i<n;i++){
  19. if(nums[i]<=0||nums[i]>n)
  20. nums[i]=1;
  21. // 使用索引和数字符号作为检查器
  22. // 例如,如果 nums[1] 是负数表示在数组中出现了数字 `1`
  23. // 如果 nums[2] 是正数 表示数字 2 没有出现
  24. for(int i=0;i<n;i++){
  25. int a = Math.abs(nums[i]);
  26. if(a==n) //使用0索引来存储数字n有没有出现过
  27. nums[0]=-Math.abs(nums[0]);
  28. else //如果出现过 将对应的位置更新为负数
  29. nums[a]=-Math.abs(nums[a]);
  30. }
  31. //从第1个元素开始 找第一个不是负数的索引下标
  32. for(int i=1;i<n;i++)
  33. if(nums[i]>0)
  34. return i;
  35. //判断n有没有出现过
  36. if(nums[0]>0)
  37. return n;
  38. //如果都出现过 则返回n+1
  39. return n+1;
  40. }