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.

【analyze】

1.由于是无序的,所以处理起来有点麻烦。可以考虑将正确的正数放在正确的索引位置上,然后再遍历整个数组

2.有两个地方一直没注意到:一.当前位置交换后,还需要判断;二.若解决第一个问题后(加入while),当前值与交换的值相同时会进入死循环

【算法】

v1:比较无耻的做法,先排序
public class Solution {
    public int firstMissingPositive(int[] nums) {
        Arrays.sort(nums);
        int flag=1;
        int i=0;
        while(i<nums.length) {
            if(nums[i]>0) {
                if(nums[i]==flag) {
                    flag++;
                    i++;
                    while(i<nums.length&&nums[i]==nums[i-1])
                        i++;
                }else
                    return flag;
            }else 
                i++;
        }
        return flag;
    }
}

v2:
public class Solution {
    public int firstMissingPositive(int[] nums) {
        if(nums==null||nums.length<1)
            return 1;
        int len=nums.length;
        for(int i=0;i<nums.length;i++) {
            while(nums[i]!=i+1&&nums[i]>0&&nums[i]<=len) {
                if(nums[i]==nums[nums[i]-1])
                    break;
                int temp=nums[i];
                nums[i]=nums[temp-1];
                nums[temp-1]=temp;
            }
        }
        for(int i=0;i<len;i++) {
            if(nums[i]!=i+1)
                return i+1;
        }
        return len+1;
    }
}

 

posted @ 2015-05-05 17:11  hwu_harry  阅读(126)  评论(0编辑  收藏  举报