设置一个结果集和路径path
本题不设置used而是再当前层设置一个map
递归三部曲:
参数和返回值:参数为输入数组nums,开始下标startindex,返回值为空
对path>1时的path输入结果集//放到这里是因为要收集所有子节点
结束条件:当startIndex>nums.length时结束。
单层递归逻辑:
for循环(i=startindex;i
节点是否再map中出现过,是就continue//出现过说明要进行数层去重
将节点输入map
将节点输入path
递归(nums,i+1)
回溯:当前节点弹出
class Solution {
List> result = new ArrayList<>();//结果集
LinkedList path = new LinkedList<>();//当前路径
public List> findSubsequences(int[] nums) {//主函数
ascziji(nums,0);//调用递归函数
return result;
}
public void ascziji(int[] nums,int startIndex){//递归函数
if(path.size()>1){//输出到结果集
result.add(new ArrayList(path));
}
//结束条件隐藏,因为startindex>nums.length时for循环也不会进入
HashMap map = new HashMap<>();//定义一个map保证树层无重复
for(int i=startIndex;i0) continue;//树层去重
map.put(nums[i],map.getOrDefault(nums[i],0)+1);//节点输入map
path.add(nums[i]);//节点输入路径
ascziji(nums,i+1);//递归下一层
path.removeLast();回溯,弹出当前节点
}
}
}