标签:
原题链接:
在不开辟另外空间的情况下,这道题做法比较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
标签:
原文地址:http://blog.csdn.net/algorithmengine/article/details/43233691