题目描述:
如果不做空间的要求,可以利用哈希的思想,元素i放在下标为i的位置。然后遍历辅助空间,第一个没有赋值的就是答案。
要求常数级别的空间,排序就只能在原数组上进行。不是抹掉原来位置的元素,而是交换,使得下标为i的位置元素为i+1(正整数从1开始). 如果数组元素的范围都是数组长度范围内,交换完成以后,每一个元素都被交换到正确的位置。如果有大于数组长度的元素,那1~数组长度范围内肯定有空缺,交换完成以后,保证数组长度范围内的元素都在正确的位置上。然后寻找第一个下标和元素不对应的就是丢失的数。
代码:
int firstMissingPositive(vector<int> &A) {
// write your code here
for(int i=0; i<A.size();){
if(A[i] == i+1) //如果i位置就是对应的元素,跳过
++i;
else{
if(A[i] >=1 && A[i]<=A.size() && A[A[i]-1] != A[i]) //判断该元素是否是正整数,并且在数组长度范围内,并且是唯一的
swap(A[i], A[A[i]-1]); //交换完成以后,i并不加一,因为换回来的元素还要进行判断
else //出现负数,大于数组元素范围的数, 重复的数,直接跳过
++i;
}
}
for(int i=0; i<A.size(); ++i){ //寻找第一个下标和元素不对应的数
if(A[i] != i+1)
return i+1;
}
return A.size()+1; //如果都是对应的,则返回数组长度的下一个元素
}
参考博客:https://blog.csdn.net/wangyuquanliuli/article/details/45749023