1. 程式人生 > >leetcode題庫——缺失的第一個正數

leetcode題庫——缺失的第一個正數

題目描述:

給定一個未排序的整數陣列,找出其中沒有出現的最小的正整數。

示例 1:

輸入: [1,2,0]
輸出: 3

示例 2:

輸入: [3,4,-1,1]
輸出: 2

示例 3:

輸入: [7,8,9,11,12]
輸出: 1

說明:

你的演算法的時間複雜度應為O(n),並且只能使用常數級別的空間。

方法:

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

思路:

對陣列內部進行粗略排序。即將元素數字,放到對應下標位置,比如元素1應該放到nums[0],即第1個位置 ;元素9應該放到nums[8]即第9個位置。在進行粗略排序時,如果元素的值比陣列長度大,則跳過,因為要找的結果肯定比這個值小,另外,若要進行交換的兩個元素值相等,也不必進行交換。

最後,遍歷陣列,將元素值與下標相減,差不為1,則此處該有的nums[i]沒有,也就是我們要找的缺失的正數。最後如果遍歷結束,都符合要求,即下標與值對應,那麼缺的這個正數肯定就是nums.size()+1了。