41. First Missing Positive(Leetcode每日一題-2020.06.27)

Problem

Given an unsorted integer array, find the smallest missing positive integer.
Note:
Your algorithm should run in O(n) time and uses constant extra space.

Example1

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

Example2

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

Example3

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

Solution

O(n)的時間複雜度和常數的空間複雜度,所以不能使用額外的哈希表。
所以對於對於nums中在[1,n]的之間的數num,將其映射到nums[num-1]的位置。
然後遍歷nums,找到第一個i+1!=nums[i]的數即可。

class Solution {
public:
    int firstMissingPositive(vector<int>& nums) {
        int n = nums.size();

        for(int i = 0;i<nums.size();++i)
        {
            //如果nums[i]在[1,n]之間,那就將它放到nums[nums[i] -1]這個位置
            //1放在nums[0],2放在nums[1]...以此類推
            while(nums[i] >=1 && nums[i] <= n && nums[i] != i+1 && nums[nums[i] - 1] != nums[i])
            {
                swap(nums[i],nums[nums[i] - 1]);
            }
        }

        for(int i = 0;i<nums.size();++i)
        {
            if(i+1 != nums[i])
                return i+1;
        }

        return n+1;
        
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章