文字分析部分摘自:
http://blog.youkuaiyun.com/nanjunxiao/article/details/12973173
思路:
虽然不能再另外开辟非常数级的额外空间,但是可以在输入数组上就地进行swap操作。
思路:交换数组元素,使得数组中第i位存放数值(i+1)。最后遍历数组,寻找第一个不符合此要求的元素,返回其下标。整个过程需要遍历两次数组,复杂度为O(n)。
下图以题目中给出的第二个例子为例,讲解操作过程。
public static int firstMissingPositive(int[] nums)
{
int len=nums.length;
if(len==0)
return 1;
for(int i=0;i<len;i++)
{
while(nums[i]!=i+1)
{
if(nums[i]>=len||nums[i]<=0||nums[i]==nums[nums[i]-1])
break;
int temp=nums[i];
nums[i]=nums[temp-1];
nums[temp-1]=temp;
}
}
for(int i=0;i<len;i++)
if(nums[i]!=i+1)
return i+1;
return len+1;
}