# 41. 缺失的第一个正数

给定一个未排序的整数数组,找出其中没有出现的最小的正整数。

示例 1:

输入: [1,2,0]
输出: 3

示例 2:

输入: [3,4,-1,1]
输出: 2

示例 3:

输入: [7,8,9,11,12]
输出: 1

说明:

你的算法的时间复杂度应为O(n),并且只能使用常数级别的空间。

const arr = [3,4,-1,1];

console.log(firstMissingPositive(arr))

function firstMissingPositive(arr) {
  const len = arr.length
  let i = 0;

  function swap(arr, a, b) {
    const temp = arr[a];
    arr[a] = arr[b];
    arr[b] = temp;
  }

  while (i < len) {
    // 当前数值不在[1, n]区间,移动下标
    if(arr[i] > len || arr[i] < 1) {
      i++;
      continue;
    }
    // 若arr[i] !== arr[arr[i] - 1],交换下标i与arr[i]-1的值
    if (arr[i] !== arr[arr[i] - 1]) {
      swap(arr, i, arr[i] - 1);
    } else {
      // 若arr[i] === arr[arr[i] - 1],则移动下标
      i++;
    }
  }

  for (let i = 0; i < arr.length; i++) {
    const element = arr[i];
    if(element !== i + 1) {
      return i+1;
    }
  }
  return len + 1;
}