题目
给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
示例
输入:nums = [1,2,0]
输出:3
输入:nums = [3,4,-1,1]
输出:2
输入:nums = [7,8,9,11,12]
输出:1
分析思路1
使用哈希表记录数组中每个数出现的次数。
从 1 开始遍历正整数,判断当前数是否在哈希表中出现过,如果没有出现过则说明该数是第一个缺失的正整数,返回该数。
如果数组中的所有正整数都出现了,则第一个缺失的正整数为数组中所有正整数的最大值加 1。
题解1
class Solution {
public int firstMissingPositive(int[] nums) {
Map<Integer,Integer> map = new HashMap();
for (int i = 0; i < nums.length; i++) {
if(nums[i]>0){
map.put(nums[i],i);
}
}
for (int i = 1; i <= nums.length; i++) {
if(!map.containsKey(i)){
return i;
}
}
return nums.length+1;
}
}
执行结果
分析思路2
另一种解决该问题的算法是基于布尔数组的方式。我们可以创建一个布尔数组 temp,其长度为 n,并初始化所有元素为 false。然后,我们遍历数组 nums,若某个元素 nums[i] 满足 1 <= nums[i] <= n,则将 temp[nums[i] - 1] 设为 true。最后,从 1 开始枚举每一个正整数,若某个正整数对应的 temp元素为 false,则该正整数就是缺失的最小正整数。
题解2
public static int find(int[] nums){
int n = nums.length;
boolean[] temp = new boolean[n];
for (int num: nums ) {
if(num>0 && num <= n){
temp[num-1] = true;
}
}
for (int i = 0; i < temp.length; i++) {
if(!temp[i]){
return i+1;
}
}
return n+1;
}
执行结果