First Missing Positive

来源:互联网 发布:新闻发稿平台源码 编辑:程序博客网 时间:2024/06/03 21:59

Given an unsorted integer array, find the first missing positive integer.

For example,
Given [1,2,0] return 3,
and [3,4,-1,1] return 2.

Your algorithm should run in O(n) time and uses constant space.

思路一: 遇到数组的题目,可以先想到排个序问题是不是就简单一点了,又或者排序之后用双指针什么的,又或者想一想可不可以交换数组的数字。 先看看排序之后问题会怎样,将原乱序数组按照升序排列,这样负数在前面,正数在后面,这样的话,遍历一遍数组,找到第一个不为0的数,判断是不是第一个数为1,如果不为1就直接返回1,否则就继续判断下一个数是不是比前一个数大1,不过,数组中可能有数字是重复的,所以要考虑去重。

public class Solution {    public int firstMissingPositive(int[] nums) {        int n=nums.length;        if(n<=0) return 1;        Arrays.sort(nums);        int pos=0;       int i=0;       for(;i<n;i++)       {           if(nums[i]<=0) continue;           else break;       }       if(i==n) return 1;       if(nums[i]>=2) return 1;       else pos=1;       for(int j=i+1;j<n;j++)       {          if(pos==nums[j]) continue;          else if(pos+1==nums[j]) pos=nums[j];          else break;              }       return pos+1;    }}

思路二: 可以利用数组的下标特性,将数组中原来的数字放在它本该在的地方,就是说,如果数组中某一个数字为k,那么就将它放在下标k-1所在的地方(即3放在下标为2的地方,6放在下标为5的地方),对于当前的下标i,如果nums[i]!=i+1; 就把nums[i]放到它应该在的地方,也就是nums[i]应该放在下标为nums[i]-1的地方。将下标为i的数字与下标为nums[i]-1的数字交换,但是要注意,如果当前数字相同,就没有必要交换了,不然会造成死循环。因为交换后nums[i]会一直不等于i+1。一直交换,直到不满足交换条件。
交换条件为
nums[i]>0 && nums[i]!=i+1 && nums[i]

public class Solution {    public int firstMissingPositive(int[] nums) {          int n=nums.length;            if(n<=0) return 1;            int i=0;             while(i<n)             {                 if(nums[i]>0 && nums[i]!=i+1 && nums[i]<n && nums[i]!=nums[nums[i]-1])                 {                     int temp=nums[i];                     nums[i]=nums[nums[i]-1];                     nums[temp-1]=temp;                 }else i++;             }             int j=0;             for(;j<n;j++)             {                 if(j!=nums[j]-1)                   break;             }            return j+1;    }}
0 0
原创粉丝点击