Skip to content

Commit 07c5674

Browse files
committed
feat: add solutions to lc problem: No.0041
No.0041.First Missing Positive
1 parent 6076706 commit 07c5674

File tree

11 files changed

+176
-178
lines changed

11 files changed

+176
-178
lines changed

solution/0000-0099/0037.Sudoku Solver/README.md

+4-11
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,7 @@ class Solution {
119119
t.add(i * 9 + j);
120120
} else {
121121
int v = board[i][j] - '1';
122-
row[i][v] = true;
123-
col[j][v] = true;
124-
block[i / 3][j / 3][v] = true;
122+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
125123
}
126124
}
127125
}
@@ -136,14 +134,10 @@ class Solution {
136134
int i = t.get(k) / 9, j = t.get(k) % 9;
137135
for (int v = 0; v < 9; ++v) {
138136
if (!row[i][v] && !col[j][v] && !block[i / 3][j / 3][v]) {
139-
row[i][v] = true;
140-
col[j][v] = true;
141-
block[i / 3][j / 3][v] = true;
137+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
142138
board[i][j] = (char) (v + '1');
143139
dfs(k + 1);
144-
row[i][v] = false;
145-
col[j][v] = false;
146-
block[i / 3][j / 3][v] = false;
140+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = false;
147141
}
148142
if (ok) {
149143
return;
@@ -176,8 +170,7 @@ public:
176170
}
177171
}
178172
}
179-
function<void(int k)> dfs;
180-
dfs = [&](int k) {
173+
function<void(int k)> dfs = [&](int k) {
181174
if (k == t.size()) {
182175
ok = true;
183176
return;

solution/0000-0099/0037.Sudoku Solver/README_EN.md

+4-11
Original file line numberDiff line numberDiff line change
@@ -95,9 +95,7 @@ class Solution {
9595
t.add(i * 9 + j);
9696
} else {
9797
int v = board[i][j] - '1';
98-
row[i][v] = true;
99-
col[j][v] = true;
100-
block[i / 3][j / 3][v] = true;
98+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
10199
}
102100
}
103101
}
@@ -112,14 +110,10 @@ class Solution {
112110
int i = t.get(k) / 9, j = t.get(k) % 9;
113111
for (int v = 0; v < 9; ++v) {
114112
if (!row[i][v] && !col[j][v] && !block[i / 3][j / 3][v]) {
115-
row[i][v] = true;
116-
col[j][v] = true;
117-
block[i / 3][j / 3][v] = true;
113+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
118114
board[i][j] = (char) (v + '1');
119115
dfs(k + 1);
120-
row[i][v] = false;
121-
col[j][v] = false;
122-
block[i / 3][j / 3][v] = false;
116+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = false;
123117
}
124118
if (ok) {
125119
return;
@@ -152,8 +146,7 @@ public:
152146
}
153147
}
154148
}
155-
function<void(int k)> dfs;
156-
dfs = [&](int k) {
149+
function<void(int k)> dfs = [&](int k) {
157150
if (k == t.size()) {
158151
ok = true;
159152
return;

solution/0000-0099/0037.Sudoku Solver/Solution.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,7 @@ class Solution {
1818
}
1919
}
2020
}
21-
function<void(int k)> dfs;
22-
dfs = [&](int k) {
21+
function<void(int k)> dfs = [&](int k) {
2322
if (k == t.size()) {
2423
ok = true;
2524
return;

solution/0000-0099/0037.Sudoku Solver/Solution.java

+3-9
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ public void solveSudoku(char[][] board) {
1414
t.add(i * 9 + j);
1515
} else {
1616
int v = board[i][j] - '1';
17-
row[i][v] = true;
18-
col[j][v] = true;
19-
block[i / 3][j / 3][v] = true;
17+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
2018
}
2119
}
2220
}
@@ -31,14 +29,10 @@ private void dfs(int k) {
3129
int i = t.get(k) / 9, j = t.get(k) % 9;
3230
for (int v = 0; v < 9; ++v) {
3331
if (!row[i][v] && !col[j][v] && !block[i / 3][j / 3][v]) {
34-
row[i][v] = true;
35-
col[j][v] = true;
36-
block[i / 3][j / 3][v] = true;
32+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = true;
3733
board[i][j] = (char) (v + '1');
3834
dfs(k + 1);
39-
row[i][v] = false;
40-
col[j][v] = false;
41-
block[i / 3][j / 3][v] = false;
35+
row[i][v] = col[j][v] = block[i / 3][j / 3][v] = false;
4236
}
4337
if (ok) {
4438
return;

solution/0000-0099/0041.First Missing Positive/README.md

+59-67
Original file line numberDiff line numberDiff line change
@@ -45,37 +45,13 @@
4545

4646
<!-- 这里可写通用的实现逻辑 -->
4747

48-
从简单到复杂。
48+
**方法一:原地交换**
4949

50-
**哈希表:**
50+
我们假设数组 `nums` 长度为 $n$,那么最小的正整数一定在 $[1, .., n + 1]$ 之间。我们可以遍历数组,将数组中的每个数 $x$ 交换到它应该在的位置上,即 $x$ 应该在的位置为 $x - 1$。如果 $x$ 不在 $[1, n + 1]$ 之间,那么我们就不用管它。
5151

52-
无视空间需求,使用哈希表或数组来记录 `nums` 中所有出现过的**正整数**。然后在其中查找 `(1 ~ nums.length)`,返回第一个不存在记录的正整数即可
52+
遍历结束后,我们再遍历数组,如果 $i+1$ 不等于 $nums[i]$,那么 $i+1$ 就是我们要找的最小的正整数
5353

54-
**排序:**
55-
56-
方法之一
57-
58-
```txt
59-
FRRST-MISSING-POSITIVE(A)
60-
A.sort()
61-
r = 1
62-
for n in A
63-
if n == r
64-
r++
65-
else if n > r
66-
break
67-
return r
68-
```
69-
70-
**常数空间:**
71-
72-
有一个现成的记录容器,那就是 `nums` 本身。
73-
74-
使用下标来记录数据,只关注正整数,对于正整数 `x`,将其归为至 `nums[x - 1]` 位置(与对应位置的元素进行交换)。
75-
76-
当所有的正整数归位之后,再次遍历 `nums`,找到第一个不满足 `nums[i] != i + 1` 表达式的位置,返回 `i + 1`。若是全部满足,则返回 `nums.length + 1`
77-
78-
> 因为存在重复元素,只要 `nums[x - 1] == x` 条件已满足,那么再遇到 `x` 时,直接跳过。
54+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。
7955

8056
<!-- tabs:start -->
8157

@@ -85,45 +61,45 @@ FRRST-MISSING-POSITIVE(A)
8561

8662
```python
8763
class Solution:
88-
def firstMissingPositive(self, nums):
89-
"""
90-
:type nums: List[int]
91-
:rtype: int
92-
"""
93-
94-
i = 1
95-
while i in nums:
96-
i += 1
97-
return i
64+
def firstMissingPositive(self, nums: List[int]) -> int:
65+
def swap(i, j):
66+
nums[i], nums[j] = nums[j], nums[i]
67+
68+
n = len(nums)
69+
for i in range(n):
70+
while 1 <= nums[i] <= n and nums[i] != nums[nums[i] - 1]:
71+
swap(i, nums[i] - 1)
72+
for i in range(n):
73+
if i + 1 != nums[i]:
74+
return i + 1
75+
return n + 1
9876
```
9977

10078
### **Java**
10179

10280
<!-- 这里可写当前语言的特殊实现逻辑 -->
10381

10482
```java
105-
public class Solution {
106-
public int firstMissingPositive(int[] num) {
107-
for (int i = 0; i < num.length; i++) {
108-
if (num[i] > 0 && num[i] < num.length && num[num[i] - 1] != num[i]) {
109-
swap(num, i, num[i] - 1);
110-
i--;
83+
class Solution {
84+
public int firstMissingPositive(int[] nums) {
85+
int n = nums.length;
86+
for (int i = 0; i < n; ++i) {
87+
while (nums[i] >= 1 && nums[i] <= n && nums[i] != nums[nums[i] - 1]) {
88+
swap(nums, i, nums[i] - 1);
11189
}
11290
}
113-
114-
for (int i = 0; i < num.length; i++) {
115-
if (i + 1 != num[i]) {
91+
for (int i = 0; i < n; ++i) {
92+
if (i + 1 != nums[i]) {
11693
return i + 1;
11794
}
11895
}
119-
120-
return num.length + 1;
96+
return n + 1;
12197
}
12298

123-
private void swap(int[] num, int i, int j) {
124-
int temp = num[i];
125-
num[i] = num[j];
126-
num[j] = temp;
99+
private void swap(int[] nums, int i, int j) {
100+
int t = nums[i];
101+
nums[i] = nums[j];
102+
nums[j] = t;
127103
}
128104
}
129105
```
@@ -134,25 +110,41 @@ public class Solution {
134110
class Solution {
135111
public:
136112
int firstMissingPositive(vector<int>& nums) {
137-
sort(nums.begin(), nums.end());
138-
int len = nums.size();
139-
if (len == 0) return 1;
140-
int i = 0;
141-
while (nums[i] <= 0 && i < len) i++;
142-
if (i == len) return 1;
143-
144-
int tmp = 1;
145-
while (i < len) {
146-
if (nums[i] != tmp) return tmp;
147-
while (len > i + 1 && nums[i] == nums[i + 1]) i++; //去重
148-
i++;
149-
tmp++;
113+
int n = nums.size();
114+
for (int i = 0; i < n; ++i) {
115+
while (nums[i] >= 1 && nums[i] <= n && nums[i] != nums[nums[i] - 1]) {
116+
swap(nums[i], nums[nums[i] - 1]);
117+
}
118+
}
119+
for (int i = 0; i < n; ++i) {
120+
if (i + 1 != nums[i]) {
121+
return i + 1;
122+
}
150123
}
151-
return tmp;
124+
return n + 1;
152125
}
153126
};
154127
```
155128
129+
### **Go**
130+
131+
```go
132+
func firstMissingPositive(nums []int) int {
133+
n := len(nums)
134+
for i := range nums {
135+
for nums[i] >= 1 && nums[i] <= n && nums[i] != nums[nums[i]-1] {
136+
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
137+
}
138+
}
139+
for i, v := range nums {
140+
if i+1 != v {
141+
return i + 1
142+
}
143+
}
144+
return n + 1
145+
}
146+
```
147+
156148
### **C**
157149

158150
```c

0 commit comments

Comments
 (0)