leetcode 41. 缺失的第一个正数-java

题目所属分类

原题链接

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。

请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。

代码案例:输入:nums = [1,2,0]
输出:3

题解

### 时间复杂度和空间复杂度都为O(n)

也就是题目没有那么多限制的情况下好做

  • 把所有的元素放到哈希表里面
  • 哈希表中没有出现的话 从小到大枚举正整数 那么那个数就是答案
class Solution {
    
    public int firstMissingPositive(int[] nums) {
        HashSet<Integer> m = new HashSet<>();
        for(int i = 0 ; i < nums.length ; i++){
            m.add(nums[i]);
        }
        int res = 1 ;
        while(m.contains(res)) res++;
        return res;
    }
}

空间复杂度为O(1)

在这里插入图片描述

class Solution {
    
    public int firstMissingPositive(int[] nums) {
        int n = nums.length;
        for(int i = 0 ; i< n ; i++){
            while(nums[i] > 0 && nums[i] <= n &&nums[i] != i + 1&& nums[i] != nums[nums[i]-1]){
                swap(nums,i,nums[i]-1);
            }
        }
        for(int i = 0; i <n ; i++){
            if(nums[i] != i+1) return i+1 ;
        }
        return n +1 ;
    }
    public void swap(int[] nums ,int a ,int b ){
        int t = nums[a];
        nums[a] = nums[b];
        nums[b] = t ;
    }
}
posted @ 2022-10-11 20:06  依嘫  阅读(26)  评论(0)    收藏  举报