Skip to content

Commit 8338093

Browse files
committed
三刷78
1 parent 79fa1ea commit 8338093

File tree

3 files changed

+75
-22
lines changed

3 files changed

+75
-22
lines changed

docs/0078-subsets.adoc

Lines changed: 42 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,40 @@
11
[#0078-subsets]
2-
= 78. Subsets
2+
= 78. 子集
33

4-
{leetcode}/problems/subsets/[LeetCode - Subsets^]
4+
https://leetcode.cn/problems/subsets/[LeetCode - 78. 子集^]
55

6-
Given a set of *distinct* integers, nums, return all possible subsets (the power set).
6+
给你一个整数数组 `nums` ,数组中的元素 *互不相同*。返回该数组所有可能的子集(幂集)。
77

8-
*Note:* The solution set must not contain duplicate subsets.
8+
解集 *不能* 包含重复的子集。你可以按 *任意顺序* 返回解集。
9+
10+
*示例 1:*
11+
12+
....
13+
输入:nums = [1,2,3]
14+
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
15+
....
16+
17+
*示例 2:*
18+
19+
....
20+
输入:nums = [0]
21+
输出:[[],[0]]
22+
....
23+
24+
*提示:*
25+
26+
* `1 \<= nums.length \<= 10`
27+
* `-10 \<= nums[i] \<= 10`
28+
* `nums` 中的所有元素 *互不相同*
929
10-
.Example:
11-
----
12-
Input: nums = [1,2,3]
13-
Output:
14-
[
15-
[3],
16-
[1],
17-
[2],
18-
[1,2,3],
19-
[1,3],
20-
[2,3],
21-
[1,2],
22-
[]
23-
]
24-
----
2530
2631
== 思路分析
2732

28-
这道题跟 xref:0090-subsets-ii.adoc[90. Subsets II] 类似。
33+
这道题跟 xref:0090-subsets-ii.adoc[90. Subsets II] 类似:使用 xref:0000-25-subsets.adoc[Subsets 子集] 模式即可轻松解决。
34+
35+
以空集为起点,每次都在已有子集后面添加新元素来构建新的子集。处理完所有元素时,就生成了全部子集。
36+
37+
如果元素中有重复元素,那么就需要先对元素排序,遇到重复元素时,就不能对虽有已有元素都添加新元素了(因为前一个元素重复,那么对全部已有元素添加新元素就会有重复自己)。只需要针对上一次新添加的子集添加新元素即可,依次执行,直到有不重复元素则再次恢复成从全部子集添加元素。
2938

3039
image::images/0078-subsets-recursion.png[{image_attr}]
3140

@@ -56,11 +65,22 @@ include::{sourcedir}/_0078_Subsets.java[tag=answer]
5665
include::{sourcedir}/_0078_Subsets_2.java[tag=answer]
5766
----
5867
--
68+
69+
三刷::
70+
+
71+
--
72+
[{java_src_attr}]
73+
----
74+
include::{sourcedir}/_0078_Subsets_3.java[tag=answer]
75+
----
76+
--
5977
====
6078

79+
6180
== 参考资料
6281

82+
. https://leetcode.cn/problems/subsets/solutions/2059409/hui-su-bu-hui-xie-tao-lu-zai-ci-pythonja-8tkl/[78. 子集 - 三种写法:选或不选/枚举选哪个/二进制枚举^]
83+
. https://leetcode.cn/problems/subsets/solutions/229569/c-zong-jie-liao-hui-su-wen-ti-lei-xing-dai-ni-gao-/[78. 子集 - C++,总结了回溯问题类型,带你搞懂回溯算法(大量例题)^]
6384
. https://leetcode.cn/problems/subsets/solutions/420294/zi-ji-by-leetcode-solution/[78. 子集 - 官方题解^]
6485
. https://leetcode.cn/problems/subsets/solutions/2566767/dai-ma-sui-xiang-lu-leetcode78zi-ji-by-c-yujc/[78. 子集 - 代码随想录^]
65-
. https://leetcode.cn/problems/subsets/solutions/229569/c-zong-jie-liao-hui-su-wen-ti-lei-xing-dai-ni-gao-/[78. 子集 - C++,总结了回溯问题类型,带你搞懂回溯算法(大量例题)^]
66-
86+
. https://leetcode.cn/problems/subsets/solutions/135419/hui-su-si-xiang-tuan-mie-pai-lie-zu-he-zi-ji-wen-t/[78. 子集 - 回溯思想团灭排列、组合、子集问题^]

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1919,6 +1919,11 @@ endif::[]
19191919
|{doc_base_url}/0079-word-search.adoc[题解]
19201920
|✅ 回溯。为了尽可能高效,找到就返回。有两个优化点:①先判断字母出现次数是否满足要求;②如果结尾字母出现次数更少,则将单词翻转,从尾部开始查找,这样可以更少回溯。
19211921

1922+
|{counter:codes2503}
1923+
|{leetcode_base_url}/subsets/[78. Subsets^]
1924+
|{doc_base_url}/0078-subsets.adoc[题解]
1925+
|✅ 子集模式。以空集为起点,每次都在已有子集后面添加新元素来构建新的子集。处理完所有元素时,就生成了全部子集。当有重复元素时,就需要略作改变了。
1926+
19221927
|===
19231928

19241929
截止目前,本轮练习一共完成 {codes2503} 道题。
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.diguage.algo.leetcode;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
public class _0078_Subsets_3 {
7+
// tag::answer[]
8+
9+
/**
10+
* @author D瓜哥 · https://www.diguage.com
11+
* @since 2025-11-16 20:09:31
12+
*/
13+
public List<List<Integer>> subsets(int[] nums) {
14+
List<List<Integer>> result = new ArrayList<>(1 << nums.length);
15+
result.add(new ArrayList<>());
16+
for (int num : nums) {
17+
int size = result.size();
18+
for (int i = 0; i < size; i++) {
19+
List<Integer> existed = result.get(i);
20+
List<Integer> adding = new ArrayList<>(existed);
21+
adding.add(num);
22+
result.add(adding);
23+
}
24+
}
25+
return result;
26+
}
27+
// end::answer[]
28+
}

0 commit comments

Comments
 (0)