public class Solution {
public int firstMissingPositive(int[] nums) {
int count = 0;
int start = 0;
int end = nums.length - 1;
// 这个把负数放到了最后的位置,其实没有必要,管负数,遇到负数直接跳过也行
while (start < end) {
if (nums[end] <= 0) {
end--;
continue;
}
if (nums[start] > 0) {
start++;
continue;
}
swap(nums, end, start);
}
for (int i = nums.length - 1; i >= 0; i--) {
if (nums[i] > 0) break;
count++;
}
int len = nums.length - count;
for (int i = 0; i < len; i++) {
//只有数字在相应的位置,或者特别大,没有位置的时候,他就继续往前走,比如1在第一个位置,就是数组的0,2应该在数组的1位置
if (i + 1 == nums[i]||nums[i]>=len) continue;
else {
//这个本来可以用i!=nums[i]-1来判断,但是可能有重复,再套一层数组是为了重复时也继续向前走,不然他会一直和它对应的位置交换
while (nums[i]-1<len&&nums[i] != nums[nums[i]-1]) {
swap(nums, nums[i] - 1, i);
}
}
}
for (int i=0;i<len;i++){
if (i+1!=nums[i]){
return i+1;
}
}
return len+1;
}
private void swap(int[] nums, int end, int start) {
int swap = nums[end];
nums[end] = nums[start];
nums[start] = swap;
}
}
41. First Missing Positive
最新推荐文章于 2020-09-09 23:19:42 发布