Leetcode:First Missing Positive

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.

这道题目说使用O(n)的时间复杂度以及常数级的空间。
那么自然不能排序,也不能申请额外非常数级的空间, 那就只能在原数组上操作了

一开始的想法时,遍历的时候,将Num[i]放在其正确的位置上,放完之后再去历一次,查到第一个不对应的下标,即是答案。
 但是思路有问题:
 1.每次遍历就把 nums[i] 和 nums[num[i]] 互换, 非正数 和 超过数组长度的 不处理。然而这样子,后面的数被换到前面之后,就不会再被遍历到,造成缺漏的情况,卡住了。
 2.每次遍历的时候,把nums[i]放在nums[nums[i]]的位置,将nums[nums[i]]先取出到tmp,然后直接对tmp进行重复操作放在正确的位置。但是想想这样就觉得很麻烦。

正确思路:
交换数组元素,使得数组中第i位存放数值(i+1)。最后遍历数组,寻找第一个不符合此要求的元素,返回其下标。整个过程需要遍历两次数组,复杂度为O(n)。

正确思路确实就是一开始的第一种思路,既然会缺漏,那么对当前位置继续操作就行了,直到当前位置的value不满足条件了。所以通常思路都很接近了,然后自己放弃了…….解决

public class first_missing_positive {

    public int firstMissingPositive(int[] nums) {
        int len = nums.length;
        int swap = 0;

  //之所以对于元素i的正确位置为 index = i-1. 
  //是因为如果一个数组都是正数,那最长只能到i-1.
        for (int i = 0 ; i < len ; i++)
        {
  //nums[i] != nums[nums[i]-1]
  //表示如果nums[i]正确位置下的元素已经正确,那么也略过 不然会陷入死循环。
        while (nums[i] > 0 && nums[i] < len 
                    && nums[i] != nums[nums[i]-1])
            {
                swap = nums[nums[i]-1];
                nums[nums[i] - 1] = nums[i];
                nums[i] = swap;

            }
        }

        for (int i = 0 ; i < len ; i++)
            if (nums[i]!=i+1)
                return i+1;

        return len+1;

    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章