41. First Missing Positive

来源:互联网 发布:qq三国js技能展示 编辑:程序博客网 时间:2024/06/03 23:39
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;    }}
0 0
原创粉丝点击