给定一个未排序的整数数组,找出其中没有出现的最小的正整数。java
示例 1:web
输入: [1,2,0] 输出: 3
示例 2:数组
输入: [3,4,-1,1] 输出: 2
示例 3:svg
输入: [7,8,9,11,12] 输出: 1
解法一思路:利用hashset来记录正整数,获取其长度,如果不缺失整数,那么set中的数字应该是1到set的长度。因此,从1开始遍历,没有的数即是缺失的。若都有,那么即是set长度加1。spa
class Solution { public int firstMissingPositive(int[] nums) { HashSet<Integer> set=new HashSet<>(); int length=0; for(int i=0;i<nums.length;i++) { if(nums[i]<=0) continue; if(set.add(nums[i])) length++; set.add(nums[i]); } int i=1; for(;i<=length;i++) { // System.out.println(!set.contains(i)); if(!set.contains(i)) return i; } return i; } }
解法二思路:新建一个和nums长度同样的数组,遍历nums数组,用新建的temp数组记录下nums数组中大于0的数减1做下标,该数字也做为其值。也就至关于下标和其值相差为1,若不为1,则为缺失的数字。code
class Solution { public int firstMissingPositive(int[] nums) { int[] temp = new int[nums.length];//初始化数组皆为0 for(int i=0;i<nums.length;i++) { if(nums[i] > 0 && nums[i] <= nums.length) { int j = nums[i] - 1; temp[j] = nums[i]; } } for(int i=0;i<temp.length;i++) { if(temp[i] != i + 1) { return i + 1; } } return nums.length + 1; } }