题目
比如[3,4,-1,1]:首先数中的 <=0 或者 >n的数都是没用的。就不管他们。
3不该在1这个位置。将-1和3换一下[-1,4,3,1]。由于是-1所以不管了。
4不该在2这个位置。将4和1换一下[-1,1,3,4]。换来了1,1也不该在2这个位置,将-1和1换一下[1,-1,3,4]。2这个位置现在是-1,我们不管他。
3,4位置分别是应该的数。
处理完了,最后扫一遍,哪个位置没有相应的数 就返回该位置下标。否则返回n+1;
注意假如 交换的两个位置上的数相等的话,不需要交换了,交换就是死循环了,这个数没用我们就不管他。
class Solution {
public int firstMissingPositive(int[] nums) {
int n=nums.length;
for(int i=0;i<n;++i){
while(nums[i]<=n&&nums[i]>0&&nums[i]!=(i+1)){
int k=nums[i];
if(nums[k-1]==nums[i]) break; //样例为[1,1]时,假如二者相等,说明k-1位置上的数
int tmp=nums[k-1];//已经正确了,这个数相当于是没用的数了。
nums[k-1]=nums[i];nums[i]=tmp;
}
}
for(int i=0;i<n;++i) if(nums[i]!=(i+1)) return (i+1);
return (n+1);
}
}