Skip to content

Commit c6a3820

Browse files
committed
三刷41
1 parent 9973377 commit c6a3820

File tree

4 files changed

+82
-24
lines changed

4 files changed

+82
-24
lines changed

docs/0000-00-note.adoc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,3 +260,6 @@ image::images/quick-sort-01.gif[{image_attr}]
260260
. https://github.com/Chanda-Abdul/Several-Coding-Patterns-for-Solving-Data-Structures-and-Algorithms-Problems-during-Interviews[Several Coding Patterns for Solving Data Structures and Algorithms Problems during Interviews^] -- 多种解题范式总结
261261
. https://leetcode.cn/problems/climbing-stairs/solutions/2560716/jiao-ni-yi-bu-bu-si-kao-dong-tai-gui-hua-7zm1/?envType=study-plan-v2&envId=selected-coding-interview[70. 爬楼梯 - 教你一步步思考动态规划:从记忆化搜索到递推^]
262262
. https://leetcode.cn/circle/discuss/xV68NV/[不同层次的面试算法学习规划^]
263+
. https://www.zhihu.com/question/36738189/answer/908664455[LeetCode按照怎样的顺序来刷题比较好?]
264+
. https://www.educative.io/courses/grokking-coding-interview[Grokking the Coding Interview Patterns^]
265+
. https://www.educative.io/courses/grokking-the-system-design-interview[Grokking the Modern System Design Interview^] -- 据说这个系统设计的题目也非常好!

docs/0041-first-missing-positive.adoc

Lines changed: 40 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,51 @@
11
[#0041-first-missing-positive]
2-
= 41. First Missing Positive
2+
= 41. 缺失的第一个正数
33

44
{leetcode}/problems/first-missing-positive/[LeetCode - First Missing Positive^]
55

6-
这道题跟 {leetcode}/problems/missing-number/[268. Missing Number - LeetCode^] 很像!
6+
给你一个未排序的整数数组 `nums` ,请你找出其中没有出现的最小的正整数。
77

8+
请你实现时间复杂度为 stem:[O(n)] 并且只使用常数级别额外空间的解决方案。
89

9-
Given an unsorted integer array, find the smallest missing positive integer.
10+
*示例 1:*
1011

11-
*Example 1:*
12+
....
13+
输入:nums = [1,2,0]
14+
输出:3
15+
解释:范围 [1,2] 中的数字都在数组中。
16+
....
1217

13-
[subs="verbatim,quotes,macros"]
14-
----
15-
Input: [1,2,0]
16-
Output: 3
17-
----
18+
*示例 2:*
1819

19-
*Example 2:*
20+
....
21+
输入:nums = [3,4,-1,1]
2022
21-
[subs="verbatim,quotes,macros"]
22-
----
23-
Input: [3,4,-1,1]
24-
Output: 2
25-
----
23+
输出:2
2624
27-
*Example 3:*
25+
解释:1 在数组中,但 2 没有。
26+
....
2827

29-
[subs="verbatim,quotes,macros"]
30-
----
31-
Input: [7,8,9,11,12]
32-
Output: 1
33-
----
28+
*示例 3:*
29+
30+
....
31+
输入:nums = [7,8,9,11,12]
32+
输出:1
33+
解释:最小的正数 1 没有出现。
34+
....
3435

35-
*Note:*
3636

37-
Your algorithm should run in _O_(_n_) time and uses constant extra space.
37+
*提示:*
38+
39+
* `1 \<= nums.length \<= 10^5^`
40+
* `-2^31^ \<= nums[i] \<= 2^31^ - 1`
3841
3942
4043
== 思路分析
4144

45+
这道题跟 {leetcode}/problems/missing-number/[268. Missing Number - LeetCode^] 很像!
46+
47+
48+
4249
image::images/0041-01.png[{image_attr}]
4350

4451
[[src-0041]]
@@ -61,10 +68,19 @@ include::{sourcedir}/_0041_FirstMissingPositive.java[tag=answer]
6168
include::{sourcedir}/_0041_FirstMissingPositive_2.java[tag=answer]
6269
----
6370
--
71+
72+
三刷::
73+
+
74+
--
75+
[{java_src_attr}]
76+
----
77+
include::{sourcedir}/_0041_FirstMissingPositive_3.java[tag=answer]
78+
----
79+
--
6480
====
6581

6682

6783
== 参考资料
6884

6985
. https://leetcode.cn/problems/first-missing-positive/solutions/304743/que-shi-de-di-yi-ge-zheng-shu-by-leetcode-solution/[41. 缺失的第一个正数 - 官方题解^]
70-
. https://leetcode.cn/problems/first-missing-positive/solutions/7703/tong-pai-xu-python-dai-ma-by-liweiwei1419/[41. 缺失的第一个正数 - 原地哈希(哈希函数为:f(nums[i]) = nums[i] - 1)^]
86+
. https://leetcode.cn/problems/first-missing-positive/solutions/7703/tong-pai-xu-python-dai-ma-by-liweiwei1419/[41. 缺失的第一个正数 - 原地哈希(哈希函数为:f(nums[i\]) = nums[i\] - 1)^]

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,11 @@ endif::[]
7575
|{doc_base_url}/0215-kth-largest-element-in-an-array.adoc[题解]
7676
|⭕️ 快速选择,想清楚边界情况!
7777

78+
|{counter:codes2503}
79+
|{leetcode_base_url}/first-missing-positive/[41. First Missing Positive^]
80+
|{doc_base_url}/0041-first-missing-positive.adoc[题解]
81+
|⭕️ 循环排序,看了答案,自己写出来了。
82+
7883
|===
7984

8085
截止目前,本轮练习一共完成 {codes2503} 道题。
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.diguage.algo.leetcode;
2+
3+
public class _0041_FirstMissingPositive_3 {
4+
// tag::answer[]
5+
/**
6+
* @author D瓜哥 · https://www.diguage.com
7+
* @since 2025-03-27 22:16:54
8+
*/
9+
public int firstMissingPositive(int[] nums) {
10+
int length = nums.length;
11+
for (int i = 0; i < length; ) {
12+
int num = nums[i];
13+
if (0 < num && num < length && num != nums[num - 1]) {
14+
// 元素在数组长度范围内,并且不在数字对应的下标(num-1)的位置就交换
15+
int temp = nums[num - 1];
16+
nums[num - 1] = num;
17+
// 要交换 i 与 num -1
18+
nums[i] = temp;
19+
} else {
20+
// 只有在当前位置无法处理(超出数组访问)
21+
// 或无需处理(数字与下标对应)时,才向前推进
22+
i++;
23+
}
24+
}
25+
// 从前向后遍历,第一个数字和下标不对应的数字就是答案
26+
for (int i = 0; i < length; i++) {
27+
if (nums[i] != i + 1) {
28+
return i + 1;
29+
}
30+
}
31+
return length + 1;
32+
}
33+
// end::answer[]
34+
}

0 commit comments

Comments
 (0)