题意:

image.png

解题思路:

  1. 思路:交换位置法
  2. 1. 保证1出现在nums[0],2出现在nums[1]的位置上,n出现在nums[n-1]的位置上;
  3. 2. [3,4,-1,1]最终交换得到[1,-1,3,4];
  4. 3. 重新遍历[1,-1,3,4],找到第一个不在该位置的数:nums[i] != i + 1;
  5. 4. 最红循环到i = 1,正确结果应该是2,但数组中结果为-1,所以缺失的数字就是i + 1 = 2;

PHP代码实现:

  1. class Solution {
  2. function firstMissingPositive($nums) {
  3. for ($i = 1; $i > 0; $i++) {
  4. if (!in_array($i, $nums)) return $i;
  5. }
  6. }
  7. function firstMissingPositive1($nums) {
  8. if (!$nums) return 1;
  9. for ($i = 0; $i < count($nums); $i++) {
  10. while ($nums[$i] > 0 && $nums[$i] != $nums[$nums[$i] - 1]) {
  11. $temp = $nums[$nums[$i] - 1];
  12. $nums[$nums[$i] - 1] = $nums[$i];
  13. $nums[$i] = $temp;
  14. }
  15. }
  16. for ($i = 0; $i < count($nums); $i++) {
  17. if ($nums[$i] != $i + 1) return $i + 1;
  18. }
  19. return count($nums) + 1;
  20. }
  21. }

GO代码实现:

  1. func firstMissingPositive(nums []int) int {
  2. n := len(nums)
  3. for i := 0; i < n; i++ {
  4. for nums[i] > 0 && nums[i] < n && nums[nums[i] - 1] != nums[i] {
  5. nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
  6. }
  7. }
  8. for i := 0; i < n; i++ {
  9. if nums[i] != i + 1 {
  10. return i + 1
  11. }
  12. }
  13. return n + 1
  14. }