1.看别人的,感觉这个题怪怪的
class Solution {
public int firstMissingPositive(int[] nums) {
int temp,i;
for(i=0; i<nums.length; i++){
while(nums[i]>0 && nums[i] <= nums.length && nums[i] != nums[nums[i]-1]){
temp = nums[i];
nums[i] = nums[nums[i]-1];
nums[temp-1] = temp;
}
}
for(i=0; i<nums.length; i++){
if(nums[i] != i+1){
break;
}
}
return i+1;
}
}
有两个要注意的地方,
1.while 这里如果这个位置i没有,一开始没理解这个while,后来试了一下
举个例子,假如初始数据为 3 4 -1 1
i=0时 3 4 -1 1 --> -1 4 3 1 此时-1不满足while条件,跳出循环
i=1是 -1 4 3 1 --> -1 1 3 4 此时,其实1还是没到自己的位置,所以需要while循环
nums[i]>0 && nums[i] <= nums.length在这里代表着,这个范围外的数字其实不用理会,
这个范围内且 这个nums[i] != nums[nums[i]-1] 意味着 在这里就是看1本来应该待得位置是不是1
是,就跳出while 不是,就和现在那个位置上的-1换
2.最后的return也是两种情况的总和
i走到最后了,就说明 这个最小的正数是长度+1
i没有走到最后,就说明 就是这个位置上的数=i+1
3.最开始我还写错一个地方,就是while里面的条件nums[i] != nums[nums[i]-1] 我写错的是nums[i] != i+1
这个时候报错的数据是 [1,1] 这种情况下,在i=1时,就跳不出while循环了