Given an unsorted integer array, find the first missing positive integer.
For example,
Given[1,2,0]return3,
and[3,4,-1,1]return2.
Your algorithm should run in O(n) time and uses constant space.
题意:给定连续的数列,找出一个缺失的正数
思路:开始理解错了题意,没有想到题中隐藏正数从1开始这么大一个信息量(不知道,我现在理解错了没)。首先想到的是用unordered_set,这样从1开始(若1不存在,就直接找到了),不断寻找值加1是否存在,从而找到缺失的正数。必须用到常数空间,恩,换个思路。遍历数组,我们将值为A[i]放在对应的位置(A[A[i]-1]),这样就按照从小到大的顺序将数组排好序了,然后再次遍历数组,找到 i+1不等于A[i]的点。值得注意的是通过交换将A[i] 放在A[A[i]-1]以后,遍历再次启动点应该是 i ,因为,新的A[i] 值是否满足A[i] =i+1还未可知。若是A[i] =i+1或是A[i]<=0只直接跳过。代码如下:
1 class Solution { 2 public: 3 int firstMissingPositive(int A[], int n) 4 { 5 int i=0; 6 while(i<n) 7 { 8 if(A[i] !=i+1 &&A[i]>0&&A[i]<=n&&A[A[i]-1] !=A[i]) 9 swap(A[i],A[A[i]-1]); 10 else 11 ++i; 12 } 13 for(i=0;i<n;++i) 14 { 15 if(A[i] !=i+1) 16 break; 17 } 18 return i+1; 19 } 20 };