90. 子集 II - 力扣(LeetCode)
思路:
题目中说明nums中可能包含重复元素,所以要去重。
去重的前提是将数组nums排序!
- 递归参数:nums,index,path
- 递归出口:当遍历完nums数组时return。
- 单层递归逻辑:i从index开始遍历,如果当前元素与其上一个元素相等且当前元素不是起始位置(也就是在树形结构中不是最左边的子树,见下图),结束本次循环;将nums[i]加入path中,接着调用递归函数,最后pop出path的最后一个元素。
由于是求子集,所以每次进入递归时就要将path收集到result中。
class Solution(object):
def back(self,nums,index,path):
self.result.append(path[:])
if index==len(nums):
return
for i in range(index,len(nums)):
if i!=index and nums[i]==nums[i-1]:
continue
path.append(nums[i])
self.back(nums,i+1,path)
path.pop()
def subsetsWithDup(self, nums):
nums.sort()
self.result=[]
self.back(nums,0,[])
return self.result