leetcode 41. First Missing Positive

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

Example 1:

Input: [1,2,0]
Output: 3

Example 2:

Input: [3,4,-1,1]
Output: 2

Example 3:

Input: [7,8,9,11,12]
Output: 1

Note:

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

 

重点在于利用数组本身的序号。missing number一定在0~nums.length的范围里。所以可以直接用 i+1 来表示。

将相应的正数正确地交换到它应该在的位置。用swap确保了constant extra space。

class Solution {
    public int firstMissingPositive(int[] nums) {
        int i = 0;
        while(i < nums.length) {
            if(nums[i] == i+1 || nums[i] <= 0 || nums[i] > nums.length) {
                i++;
            }else if(nums[i] != nums[nums[i]-1]) {
                swap(nums, i, nums[i]-1);//这里旨在让第n个位子上有着正确的数字,但如果已经有了正确的数字,就不必再换了 可以设想这个例子:[1,1]
            }
            else i++;
        }
        i = 0;
        while(i < nums.length && nums[i] == i+1) i++; 
        return i+1;
    }
    
    private void swap(int[] A, int i, int j){
        int temp = A[i];
        A[i] = A[j];
        A[j] = temp;
    }
    
}

 

posted @ 2019-02-26 16:19  JamieLiu  阅读(109)  评论(0编辑  收藏  举报