day36 NC30 缺失的第一个正整数(Java)

121 阅读2分钟

题目来源: NC30 缺失的第一个正整数

题目描述:

  • 描述: 给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数 数据范围: 231nums[i]2311 −2^{31} ≤nums[i]≤2^{31}−1,0len(nums)51050≤len(nums)≤5∗10^5
示例1:
输入:[1,0,2]
返回值:3

示例2:
输入:[-2,3,4,1,5]
输出:2

思路:哈希表

  • 知识点:哈希表 思路:
    • 由题意我们可以知道,无重复元素,那么对于一个长度为n的数组,而且没有重复,则意味着如果数组填满了1 ~ n,则缺失的第一个正整数是n+1,如果数组并没有填满1 ~ n,那么缺失的第一个正整数就是整数1~n之间的某一个数.
    • 对于这种查询是否有元素缺失(1~n之间是否有缺失),我们完全可以使用哈希表来进行辅助确认,其实如果是使用一个辅助数组也可以
  • 具体做法:
    • 1.首先我们要构建一个哈希表来辅助操作
    • 2.对数组进行遍历,将每个元素放入哈希表的key值中,并将对应的value设为1表示存在
    • 3.从1开始,遍历到n,在哈希表中查询该数是否存在,如果没有存在,那么正说明数组中也没有这个数字,则改数字就是缺失的第一个正整数
    • 4.如果整数1~n在哈希表中都出现过了,那么这就说明数组填满了整数1 ~ n,即缺失的第一个正整数就是n+1

具体实现:

import java.util.*;
public class Solution {
    public int minNumberDisappeared (int[] nums) {
        int n = nums.length;
        HashMap<Integer, Integer> mp = new HashMap<Integer, Integer>(); 
        //哈希表记录数组中出现的每个数字
        for(int i = 0; i < n; i++) 
            mp.put(nums[i], 1);
        int res = 1;
        //从1开始找到哈希表中第一个没有出现的正整数
        while(mp.containsKey(res)) 
            res++;
        return res;
    }
}

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 11 天,点击查看活动详情