[Leetcode] 41 - First Missing Positive

原题链接:


在不开辟另外空间的情况下,这道题做法比较tricky。做法如下:

1. 预先扫描当前数组,将小于0的数值全部设置为n + 1,这样新的n + 1也不会对之后的计算产生影响

2. 再次扫描数组,如果当前index绝对值小于等于n,则将A[A[index] - 1]设置为负值(所以之前为什么说取绝对值)。

3. 最后扫描数组,如果当前对应值为正值,则说明当前index + 1是第一个缺失的positive number。

4. 如果都为负值,则说明n + 1是missing positive number


class Solution {
public:
    int firstMissingPositive(int A[], int n) {
        for (int i = 0; i < n; ++i) {
            if (A[i] <= 0) {
                A[i] = n + 1;
            }
        }
        
        for (int i = 0; i < n; ++i) {
            int cur = abs(A[i]);
            if (cur <= n) {
                if (A[cur - 1] > 0) {
                    A[cur - 1] *= -1;
                }
            }
        }
        
        for (int i = 0; i < n; ++i) {
            if (A[i] > 0) {
                return i + 1;
            }
        }
        
        return n + 1;
    }
};


你可能感兴趣的:([Leetcode] 41 - First Missing Positive)