Skip to content

Commit c46f002

Browse files
committed
41.缺失的第一个正数
1 parent 8f61cb4 commit c46f002

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

leetcode_Java/DoneTitle.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
37. 解数独
1919
39. 组合总和
2020
40. 组合总和 II
21+
41. 缺失的第一个正数
2122
46. 全排列
2223
47. 全排列 II
2324
42. 接雨水

leetcode_Java/Solution0041.java

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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

Comments
 (0)