1. 程式人生 > >First Missing Positive-計數排序/桶排序

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.

這題最主要的是要求時間複雜度為O(n),空間複雜度為O(1)。

剛開始想動態規劃,沒想出來,後來看網上說線性排序,看了別人的方法後才懂的。

既然不能用額外空間,那就只有利用陣列本身,跟Counting sort一樣,利用陣列的index來作為數字本身的索引,把正數按照遞增順序依次放到陣列中。即讓A[0]=1, A[1]=2, A[2]=3, ... , 這樣一來,最後如果哪個陣列元素違反了A[i]=i+1即說明i+1就是我們要求的第一個缺失的正數。對於那些不在範圍內的數字,我們可以直接跳過,比如說負數,0,或者超過陣列長度的正數,這些都不會是我們的答案。要注意的是,交換之後還需要判斷交換來數字是否滿足條件,不滿足的話則繼續交換。實 現中還需要注意一個細節,就是如果當前的數字所對應的下標已經是對應數字了,那麼我們也需要跳過,因為那個位置的數字已經滿足要求了,否則會出現一直來回 交換的死迴圈。

http://www.cnblogs.com/ccsccs/articles/4216113.html


程式碼如下:

class Solution {
public://
    int firstMissingPositive(vector<int>& nums) {
        int i, size = nums.size();
        for(i = 0; i < size; ++i){
            while(nums[i]!=i+1&&nums[i]>0&&nums[i]<size){
                int temp = nums[i];
                if(nums[temp-1]==temp)
                    nums[i] = -1;
                else{
                    nums[i] = nums[temp-1];
                    nums[temp-1] = temp;
                }
            }
        }
        for(i = 0; i < size; ++i)
            if(nums[i]!=i+1) break;
        return i+1;
    }
};