41. 缺失的第一个正数 - LeetCode

41. 缺失的第一个正数

题目链接

排序后寻找

  • 先排序,再看每个位置的数是否符合
  • 第一个不符合的位置,就是缺失的第一个正数
class Solution {
    public int firstMissingPositive(int[] nums) {
        Arrays.sort(nums);
        int ans = 1;
        for(int x : nums){
            if(x > ans)
                break;
            if(x == ans)
                ans++;
        }
        return ans;
    }
}

原地归位后寻找

  • 题目要求时间复杂度O(n),那么就不能排序,必然要使用索引直接把正数放到对应的位置
  • 但是要求常数级别的额外空间,那么只能在原地交换
  • 原数组是0len-1,我们需要在里面存储正整数1len,所以正确的位置应该是nums[i] = i + 1
  • 所以我们扫描数组,把位置不正确的数交换到正确的位置,最后再按照相同的方式扫描即可
  • 过程中需要注意一点:
    • 交换的时候,要先改变nums[nums[i] - 1],否则nums[i]改变后,nums[nums[i] - 1]就找不到了
class Solution {
    public int firstMissingPositive(int[] nums) {
        int len = nums.length;
        for(int i = 0; i < len; i++){
            while(nums[i] > 0 && nums[i] <= len && nums[nums[i] - 1] != nums[i]){
                int temp = nums[nums[i] - 1];
                nums[nums[i] - 1] = nums[i];
                nums[i] = temp;
            }
        }
        for(int i = 0; i < len; i++)
            if(nums[i] - 1 != i)
                return i + 1;
        return len + 1;
    }
}
posted @ 2021-02-24 10:37  一天到晚睡觉的鱼  阅读(54)  评论(0)    收藏  举报