题目大意:给出一个数组,从1开始找出数组中缺失的第一个正数。例子如下:
法一:利用HashSet。将数组中的数都存入set集合中,然后从1开始遍历set集合,一旦不存在则返回。代码如下(耗时7ms):
1 public int firstMissingPositive(int[] nums) { 2 if(nums.length == 0) { 3 return 1; 4 } 5 //存入set集合 6 HashSet<Integer> set = new HashSet<Integer>(); 7 for(int i = 0; i < nums.length; i++) { 8 set.add(nums[i]); 9 } 10 //从1开始遍历set集合 11 int cnt = 1; 12 while(true) { 13 if(set.contains(cnt)) { 14 cnt++; 15 } 16 else { 17 return cnt; 18 } 19 } 20 }
法二:常数空间。具体见。代码如下(耗时7ms):
1 public int firstMissingPositive(int[] nums) { 2 int i = 0; 3 while(i < nums.length) { 4 //把nums[i]放入i+1 5 //其中nums[i]负数、nums[i]超过nums的总个数,nums[i]已经是i+1,这三种情况下,不需要进行替换 6 if(nums[i] > 0 && nums[i] != i + 1 && nums[i] <= nums.length && nums[nums[i] - 1] != nums[i]) { 7 int tmp = nums[nums[i] - 1]; 8 nums[nums[i] - 1] = nums[i]; 9 nums[i] = tmp; 10 } 11 else { 12 i++; 13 } 14 } 15 //最后得到的数组一定是在满足条件的情况下的下标中,nums[i]=i+1,遍历即可 16 //比如{0,2,2,1,1}最后得到的数组一定是{1,2,2,0,1} 17 for(int j = 0; j < nums.length; j++) { 18 if(nums[j] != j + 1) { 19 return j + 1; 20 } 21 } 22 return nums.length + 1; 23 }