41. First Missing Positive

Given an unsorted integer array, find the first missing positive integer.

For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.

Your algorithm should run in O(n) time and uses constant space.

本题开始没认真审题,后来发现要求在给定的空间里面做题。因此不能用missing number里面的创建数组来做;

看了discussion的讨论,发现很巧妙。首先,把数组分成两部分,把值大于0的数放在数组的前面,假设有k个大于0的值。然后在那些值大于0的部分遍历,如果值还小于等于k,那么就把那个索引的数组标记为负数,依次遍历,代码如下:

public class Solution {

    public int firstMissingPositive(int[] nums) {

        int len = nums.length;

        if(len==0) return 1;

        int k =part(nums);

        for(int i=0;i<k;i++){

            int temp = Math.abs(nums[i]);

            if(temp<=k) nums[temp-1] = nums[temp-1]>0?-nums[temp-1]:nums[temp-1];

        }

        int res = k+1;

        for(int i=0;i<k;i++){

            if(nums[i]>0){

                res = i+1;

                break;

            }

        }

        return res;

    }

    public int part(int[] nums){

        int q = 0;

        for(int i=0;i<nums.length;i++){

            if(nums[i]>0){

                swap(nums,q++,i);

            }

        }

        return q;

    }

    public void swap(int[] nums,int i,int j){

        int temp = nums[i];

        nums[i] = nums[j];

        nums[j] = temp;

    }

}

这道题可以用来解决所有不连续出现的值,是否连续的问题,但是,missing number是不可以这么解决的,因为包括了0,而0没有负数。这道题的隐身含义是,相当于创建了一个boolean类型的数组。

原文地址:https://www.cnblogs.com/codeskiller/p/6377937.html