【LeetCode】41. First Missing Positive

来源:互联网 发布:淘宝微淘动态 编辑:程序博客网 时间:2024/06/16 02:00

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.

   这道题的题目大意为找到第一个未出现的正数。比如题目中给出的例子[1,2,0]正数有1,2,第一个丢失的正数就是3;[3,4,-1,1]正数有1,3,4第一个丢失的正数就是2,所有返回2。这道题他要求只遍历一次并且使用常数的空间。我刚开始是这么做的:

    public int firstMissingPositive(int[] nums) {        if(nums.length == 0) return 1;        List<Integer> temp = new ArrayList<Integer>();        for(int i=0;i<nums.length;i++){            temp.add(nums[i]);        }        for(int i=1;i<Integer.MAX_VALUE;i++){            if(!temp.contains(i)) return i;        }        return 0;    }
把他给定的数组放到List集合中,然后通过遍历所有正数,判断是否出现在List集合中,从而得出值。这样交上去是可以AC的,但是不知道有没有违反它要使用常数空间的约束。于是又想了另一种方法,将数组下标与值对应起来(交换使每个正数到齐对应位置nums[i]==i+1,1放在下标为0的位置,2放在下标为1的位置,以此类推),这样使每个正数归位,然后遍历一遍,第一个不满足这个条件的(nums[i]==i+1),就是结果了。代码如下:

    //建立数组下标和对应值的关系    public int firstMissingPositive(int[] nums) {        if(nums.length==0) return 1;        for(int i=0;i<nums.length;i++){            if(nums[i]<nums.length&&nums[i]>0&&nums[i]!=nums[nums[i]-1]){                int temp = nums[nums[i]-1];                nums[nums[i]-1] = nums[i];                nums[i] = temp;                i--;            }        }        for(int i=0;i<nums.length;i++){            //System.out.println(nums[i]);            if(nums[i]!=i+1) return i+1;        }        return nums.length+1;    } 


原创粉丝点击