41. First Missing Positive

题目链接

题目大意:给出一个数组,从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     }
View Code

法二:常数空间。具体见。代码如下(耗时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     }
View Code
原文地址:https://www.cnblogs.com/cing/p/9340458.html