image.png

解题思路

将数组视为哈希表

image.png
image.png

  1. public int firstMissingPositive(int[] nums) {
  2. int len = nums.length;
  3. for (int i = 0; i < len; i++) {
  4. while (nums[i] > 0 && nums[i] <= len && nums[nums[i] - 1] != nums[i]) {
  5. // 满足在指定范围内、并且没有放在正确的位置上,才交换
  6. // 例如:数值 3 应该放在索引 2 的位置上
  7. swap(nums, nums[i] - 1, i);
  8. }
  9. }
  10. // [1, -1, 3, 4]
  11. for (int i = 0; i < len; i++) {
  12. if (nums[i] != i + 1) {
  13. return i + 1;
  14. }
  15. }
  16. // 都正确则返回数组长度 + 1
  17. return len + 1;
  18. }
  19. private void swap(int[] nums, int index1, int index2) {
  20. int temp = nums[index1];
  21. nums[index1] = nums[index2];
  22. nums[index2] = temp;
  23. }