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