Leetcode: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.

 

题解分析:

如果是T(n)的时间 T(n)的空间,则非常简单,首先遍历完数组,建立hash表,第二轮遍历直接找出第一个缺失的正数

class Solution {
public:
    int firstMissingPositive(int A[], int n) {
        assert(A != NULL && n >= 0);
        unordered_set<int> numSet;
        for (int i = 0; i < n; ++i) {
            numSet.insert(A[i]);
        }
        
        for (int i = 1; ; ++i) {
            auto iter = numSet.find(i);
            if (iter == numSet.end()) {
                return i;
            }
        }
    }
};

 

空间复杂度O(1)的解法:

桶排序的思想,最基本的思想就是 每个元素都归位到固定编号的桶内

这里正常情况下,应该是 1放在index = 0位置上,2放在index = 1的位置上,类似的,我们可以理解为 A[i]应该归位到编号为A[i]-1的桶内

当A[i] = i + 1时,元素已经位于正确的桶内了,直接跳过

当A[i] != i + 1时,我们不断的 交换 A[i] 与 A[A[i] - 1] 这两个值,直到发生以下情况:

a. A[i] = i + 1,循环结束

b. 因为与 A[A[i] - 1]做交换,所以 A[i] - 1作为下标必须符合范围,即 1 <= A[i] <= n,否则直接break

 

class Solution {
public:
    int firstMissingPositive(int A[], int n) {
        bucketSort(A, n);
        for (int i = 0; i < n; ++i) {
            if (A[i] != i + 1) {
                return i + 1;
            }
        }
        return n + 1;
        
    }
    
    void bucketSort(int A[], int n) {
        assert(A != NULL && n >= 0);
        for (int i = 0; i < n; ++i) {
            while (A[i] != i + 1) {
                if (A[i] <= 0 || A[i] > n || A[i] == A[A[i] - 1]) {
                    break;
                }
                std::swap(A[i], A[A[i] - 1]);
            }
        }
    }
};

 

你可能感兴趣的:(LeetCode)