1. 程式人生 > >Leetcode 41. 缺失的第一個正數

Leetcode 41. 缺失的第一個正數

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

示例 1:

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

示例 2:

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

示例 3:

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

說明:

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

一開始建了一個flag陣列做的,發現好像並不能這麼做。。。

後來上網上搜了題解。。。才碰巧弄明白。。。

思路就是,判斷某個數是否在正確的位置,舉個例子,就是1必須在陣列中的第一個位置。如果不是,且正確的位置沒有對應正確的元素,兩個位置的值進行交換。。。負數和大於陣列元素的值除外。。。

然後挨個遍歷是否對應正確的位置就行了。。。

還要注意輸出Size+1的情況

程式碼如下:

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