# 缺失的第一个正数

leetcode - 41. 缺失的第一个正数 (opens new window)

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

示例 1:

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

示例 2:

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

示例 3:

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

# Johninch

思路:

  • 找出原数组中大于0且小于等于数组长度的值,以值-1作为索引放入新数组中,如2放到索引为1的位置
  • 因此可得到新数组形如[1, 2, 3, ...]
  • 遍历新数组,找出第一个 索引+1 !== 值 的元素,返回 索引+1 即为所求,如果遍历完没有返回,则返回 新数组长度+1

注意:这里之所以用新数组而不用在原数组上swap操作,是考虑到swap操作可能会有数字交换后没有遍历到的情况,为了算法简单

/**
 * @param {number[]} arr
 * @return {number}
 */
var firstMissingPositive = function(arr) {
    let newArr = [];
    for (let i = 0, len = arr.length; i < len; i++) {
        let value = arr[i];
        if (value > 0 && value <= len) {
            newArr[value-1] = value;
        }
    }

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

    return newArr.length + 1;
};

export default firstMissingPositive;
Last Updated: 4/27/2020, 5:02:21 PM