Skip to content

Commit f421885

Browse files
committed
四刷90
1 parent 8338093 commit f421885

File tree

4 files changed

+58
-4
lines changed

4 files changed

+58
-4
lines changed

docs/0090-subsets-ii.adoc

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
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]
7983
include::{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.

logbook/202503.adoc

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff 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} 道题。
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
}

0 commit comments

Comments
 (0)