File tree Expand file tree Collapse file tree 4 files changed +58
-4
lines changed
src/main/java/com/diguage/algo/leetcode Expand file tree Collapse file tree 4 files changed +58
-4
lines changed Original file line number Diff line number Diff line change 11[#0090-subsets-ii]
22= 90. 子集 II
33
4- https://leetcode.cn/problems/subsets-ii/[LeetCode - 90. 子集 II ^]
4+ https://leetcode.cn/problems/subsets-ii/[LeetCode - 90. 子集 II^]
55
66给你一个整数数组 `nums` ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。
77
@@ -23,14 +23,18 @@ https://leetcode.cn/problems/subsets-ii/[LeetCode - 90. 子集 II ^]
2323
2424*提示:*
2525
26- * `+1 <= nums.length <= 10+`
27- * `+-10 <= nums[i] <= 10+`
26+ * `1 \<= nums.length \<= 10`
27+ * `-10 \<= nums[i] \<= 10`
28+
29+
2830
2931== 解题分析
3032
3133这道题跟 xref:0078-subsets.adoc[78. Subsets] 类似。不一样的地方是要处理重复元素:
3234
33- image::images/0090-01.png[{image_attr}]
35+ 如果元素中有重复元素,那么就需要先对元素排序,遇到重复元素时,就不能对虽有已有元素都添加新元素了(因为前一个元素重复,那么对全部已有元素添加新元素就会有重复自己)。只需要针对上一次新添加的子集添加新元素即可,依次执行,直到有不重复元素则再次恢复成从全部子集添加元素。
36+
37+ image::images/0090-10.png[{image_attr}]
3438
3539第 4 行新添加的 2 要加到第 3 行的所有解中,而第 3 行的一部分解是旧解,一部分是新解。可以看到,我们黑色部分是由第 3 行的旧解产生的,橙色部分是由新解产生的。
3640
@@ -79,11 +83,21 @@ include::{sourcedir}/_0090_SubsetsII_30.java[tag=answer]
7983include::{sourcedir}/_0090_SubsetsII_31.java[tag=answer]
8084----
8185--
86+
87+ 四刷::
88+ +
89+ --
90+ [{java_src_attr}]
91+ ----
92+ include::{sourcedir}/_0090_SubsetsIi_4.java[tag=answer]
93+ ----
94+ --
8295====
8396
8497== 参考资料
8598
8699. https://leetcode.cn/problems/subsets-ii/solutions/10090/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-19/[90. 子集 II - 详细通俗的思路分析,多解法^]
100+ . https://leetcode.cn/problems/subsets-ii/solutions/3036436/liang-chong-fang-fa-xuan-huo-bu-xuan-mei-v0js/[90. 子集 II - 两种方法:选或不选/枚举选哪个^]
87101. https://leetcode.cn/problems/subsets-ii/solutions/690549/zi-ji-ii-by-leetcode-solution-7inq/[90. 子集 II - 官方题解^]
88102. https://leetcode.cn/problems/subsets-ii/solutions/690866/90-zi-ji-iiche-di-li-jie-zi-ji-wen-ti-ru-djmf/[90. 子集 II - 「代码随想录」带你学透回溯算法!90. 子集 II:【彻底理解子集问题如何去重】^]
89103
File renamed without changes.
Original file line number Diff line number Diff line change @@ -1924,6 +1924,11 @@ endif::[]
19241924|{doc_base_url} /0078-subsets.adoc[题解]
19251925|✅ 子集模式。以空集为起点,每次都在已有子集后面添加新元素来构建新的子集。处理完所有元素时,就生成了全部子集。当有重复元素时,就需要略作改变了。
19261926
1927+ |{counter:codes2503}
1928+ |{leetcode_base_url} /subsets-ii/[90. 子集 II]
1929+ |{doc_base_url} /0090-subsets-ii.adoc[题解]
1930+ |✅ 子集模式。需要注意重复元素的处理。如果元素中有重复元素,那么就需要先对元素排序,遇到重复元素时,就不能对虽有已有元素都添加新元素了。只需要针对上一次新添加的子集添加新元素即可,依次执行,直到有不重复元素则再次恢复成从全部子集添加元素。
1931+
19271932|===
19281933
19291934截止目前,本轮练习一共完成 {codes2503} 道题。
Original file line number Diff line number Diff line change 1+ package com .diguage .algo .leetcode ;
2+
3+ import java .util .ArrayList ;
4+ import java .util .Arrays ;
5+ import java .util .List ;
6+
7+ public class _0090_SubsetsIi_4 {
8+ // tag::answer[]
9+ /**
10+ * @author D瓜哥 · https://www.diguage.com
11+ * @since 2025-11-16 20:36:30
12+ */
13+ public List <List <Integer >> subsetsWithDup (int [] nums ) {
14+ Arrays .sort (nums );
15+ List <List <Integer >> result = new ArrayList <>(1 << nums .length );
16+ result .add (List .of ());
17+ result .add (List .of (nums [0 ]));
18+ int start = 1 ;
19+ for (int i = 1 ; i < nums .length ; i ++) {
20+ // 如果与前一个元素相同,则只需要处理上次添加的子集即可,否则处理全部已有子集
21+ if (nums [i - 1 ] != nums [i ]) {
22+ start = 0 ;
23+ }
24+ int size = result .size ();
25+ for (int j = start ; j < size ; j ++) {
26+ List <Integer > adding = new ArrayList <>(result .get (j ));
27+ adding .add (nums [i ]);
28+ result .add (adding );
29+ }
30+ start = size ;
31+ }
32+ return result ;
33+ }
34+ // end::answer[]
35+ }
You can’t perform that action at this time.
0 commit comments