Bit
1 | class Solution { |
去重逻辑分析:
当数组为 [2, 2] 时,我们枚举所有的二进制组合,为了方便演示,右边统一为低位:
1 | index: 1 0 |
可知子集 [2] 与 [2] 重复,我们只能保留其中一个子集。观察其二进制组合,为 0 1
与 1 0
,为了处理方便,我们不保留 1 0
这一种组合。即遍历时,当之前的数字与当前数字相同且前一个数字对应的二进制位为 0 时,我们丢弃该组合。
同理,当数组为 [1, 2, 2] 时,我们枚举所有的二进制组合:
1 | index: 2 1 0 |
可知子集 [2] 与 [2] 重复,二进制组合分别为 0 1 0
与 1 0 0
,其中重复的数字 2 对应的二进制组合为 0 1
与 1 0
。同上,我们不保留 1 0 0
这一种组合。子集 [1, 2] 与 [1, 2] 重复,二进制组合分别为 0 1 1
与 1 0 1
,其中重复的数字 2 对应的二进制组合为 0 1
与 1 0
,处理方式同上,我们不保留 1 0 1
这一种组合。
同理,当数组为 [1, 2, 2, 2] 时,我们枚举所有的二进制组合:
1 | index: 3 2 1 0 |
可知子集 [2] 与 [2] 与 [2] 重复,二进制组合分别为 0 0 1 0
与 0 1 0 0
与 1 0 0 0
,其中重复的数字 2 对应的二进制组合为 0 0 1
与 0 1 0
与 1 0 0
,同上我们不保留 0 1 0 0
与 1 0 0 0
这两种组合。其余重复的子集分析过程同上。
Backtracking
1 | class Solution { |
Backtracking
1 | class Solution { |
注意过滤条件的位置,仅过滤元素值相同且选择当前元素且未选择前一个元素的场景。即未选择当前元素且未选择前一个元素这种组合不能被过滤。
即对数组 [2, 2] 来说,遍历过程中有四种组合:
2 | 2 |
---|---|
不选 | 不选 |
不选 | 选 |
选 | 不选 |
选 | 选 |
其中 [] 组合不能被过滤,即过滤条件一定要写在未选择递归调用之后。