1
+ // 41. 缺失的第一个正数
2
+
3
+
4
+ /*
5
+ 置换:
6
+ 1、求缺失的第一个正数,所以要找的数一定在[1,n+1]
7
+ 2、遍历数组,在i位置上,将i位置的元素x交换到x-1的位置上,即元素值与索引对应。循环交换i位置的元素,直到不满足条件
8
+ 3、遍历数组,如果i位置上的元素值不是i+1,说明缺失的第一个正数是i+1
9
+ 4、数组元素和索引都对应了,则缺失的第一个正数是n+1
10
+ */
11
+ class Solution {
12
+ public int firstMissingPositive (int [] nums ) {
13
+ int n = nums .length ;
14
+ for (int i = 0 ; i < n ; i ++) {
15
+ while (nums [i ] >= 1 && nums [i ] <= n && nums [nums [i ] - 1 ] != nums [i ]) {
16
+ int temp = nums [nums [i ] - 1 ];
17
+ nums [nums [i ] - 1 ] = nums [i ];
18
+ nums [i ] = temp ;
19
+ }
20
+ }
21
+ for (int i = 0 ; i < n ; i ++) {
22
+ if (nums [i ] != i + 1 ) {
23
+ return i + 1 ;
24
+ }
25
+ }
26
+ return n + 1 ;
27
+ }
28
+ }
29
+
30
+
31
+ /*
32
+ 排序:
33
+ 1、数组升序排序
34
+ 2、遍历数组,索引走到对应值为正数位置
35
+ 3、索引走完即没有正数,或者第一个正数不是1,那么直接返回缺失的第一个正数为1
36
+ 4、遍历上一步索引开始的剩余数组,如果下一个数不是 相等或连续,说明缺失正数,返回缺失的正数
37
+ 5、如果遍历完没有缺失,则缺失的第一个正数是最后一个数加1
38
+ */
39
+ class Solution {
40
+ public int firstMissingPositive (int [] nums ) {
41
+ Arrays .sort (nums );
42
+ int n = nums .length ;
43
+ int index = 0 ;
44
+ while (index < n && nums [index ] < 1 ) {
45
+ index ++;
46
+ }
47
+ if (index == n || nums [index ] != 1 ) {
48
+ return 1 ;
49
+ }
50
+ for (int i = index ; i < n - 1 ; i ++) {
51
+ if (nums [i ] != nums [i + 1 ] && nums [i ] + 1 != nums [i + 1 ]) {
52
+ return nums [i ] + 1 ;
53
+ }
54
+ }
55
+ return nums [n - 1 ] + 1 ;
56
+ }
57
+ }
58
+
59
+
60
+ /*
61
+ 集合:
62
+ 1、遍历数组将元素存入集合
63
+ 2、求缺失的第一个正数,所以要找的数一定在[1,n+1],如果该数字没有在集合中,说明该数字是缺失的第一个正数,否则缺失的第一个正数是最后一个数加1
64
+ */
65
+ class Solution {
66
+ public int firstMissingPositive (int [] nums ) {
67
+ Set <Integer > set = new HashSet <>();
68
+ for (int num : nums ) {
69
+ set .add (num );
70
+ }
71
+ int n = nums .length ;
72
+ for (int i = 1 ; i <= n ; i ++) {
73
+ if (!set .contains (i )) {
74
+ return i ;
75
+ }
76
+ }
77
+ return n + 1 ;
78
+ }
79
+ }
0 commit comments