leetcode 41.缺失的第一个正数

119 阅读1分钟
/**
 * @param {number[]} nums
 * @return {number}
 */
 var firstMissingPositive = function(nums) {
    nums.forEach((n, i) => {
        if (n <= 0) nums[i] = nums.length + 1;
    });
    let a = false;
    let t;
    nums.forEach(n => {
        if (Math.abs(n) === nums.length) {
            a = true;
            return;
        }
        if (n < 0) {
            t = -n;
            if (t < nums.length) {
                if (nums[t] > 0) {
                    nums[t] = -nums[t];
                }
            }
        } else if (n > 0 && n < nums.length) {
            if (nums[n] > 0) {
                nums[n] = -nums[n];
            }
        }
    });

    for (let i = 1; i < nums.length; i++) {
        if (nums[i] > 0) {
            return i;
        }
    }
    return a ? (nums.length + 1) : nums.length;
};

// console.info(firstMissingPositive( [1,0,3,3,0,2]));
// console.info(firstMissingPositive( [1,1000]));
// console.info(firstMissingPositive( [1,2,0]));
// console.info(firstMissingPositive([3,4,-1,1]));
// console.info(firstMissingPositive([7,8,9,11,12]));

/**
 * 最小的正整数只会出现在[1, n + 1](如果[1, n]都出现了,则答案为n + 1。如果有任何一个没出现过,则为[1, n];
 * 将[1,n]映射至 nums, 出现过则设为负数。最后遍历下标,找第一个不为负数的下标。
 */