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.
有趣的题目:利用字符哈希。因为原题要求 constant space,所以可以用数组本身做哈希。如果A[i]在1到n之间,则将A中index为A[i]-1的数翻转成负数。原数组中的负数与零会confuse,所以我们强制设为INT_MAX即可。(这种做法不可避免地破坏了原来的数组)。复杂度为3n,共三次遍历:
1. 将负数与零设为 INT_MAX。
2. 如果A[i]在1到n之间,则将A中index为A[i]-1的数翻转成负数。(注意,A[i]可能经历了翻转成为负数,所以要取absolute value)
3. 扫描A[i]中的第一个正数,返回i+1;若A[i]都为正数,则返回n+1。
class Solution {
public:
int firstMissingPositive(int A[], int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
if(n==0) return 1;
for(int i=0;i<n;i++)
{
if(A[i]<=0) A[i] = INT_MAX;
}
for(int i=0;i<n;i++)
{
if(abs(A[i])<=n && A[i]!=0) A[abs(A[i])-1] = abs(A[abs(A[i])-1]) * (-1);
}
for(int i=0;i<n;i++)
{
if(A[i]>0) return i+1;
}
return n+1;
}
};
本文介绍了一种在未排序整数数组中寻找第一个缺失正整数的算法,该算法能在O(n)时间内运行并使用常数空间。通过巧妙利用数组本身作为哈希表,经过三次遍历来解决这个问题。
274

被折叠的 条评论
为什么被折叠?



