> For the complete documentation index, see [llms.txt](https://cai-sen-se.gitbook.io/leetcode/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://cai-sen-se.gitbook.io/leetcode/1-200/90.-zi-ji-ii.md).

# 90. 子集 II

<https://leetcode-cn.com/problems/subsets-ii/>

## 解法一：

类似**78.子集**，由于数组存在重复，需要在其基础上加上去重条件。

类似于**40.组合总和 II**的去重判断，先排序，然后将同一层递归的重复数跳过，不同层则不需要跳过。

```python
class Solution:
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        self.res = []
        tmpList = []
        nums.sort()
        for i in range(len(nums)+1):  #len+1轮循环，每次输出长度为i的所有组合
            self.backtrack(nums, tmpList, i, 0)
        return self.res

    def backtrack(self, nums, tmpList, k, start):
        if len(tmpList) == k:
            self.res.append(list(tmpList))
        for i in range(start, len(nums)):    #tmp的修改直接写在递归里
            if i-1 >= start and nums[i-1] == nums[i]:    #跳过同一层递归的重复数字
                continue
            self.backtrack(nums, tmpList+[nums[i]], k, i + 1)
```
