仅为个人记录复盘学习历程,解题思路来自代码随想录
代码随想录刷题笔记总结网址:
代码随想录
90.子集II
给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
提供参数:整数数组nums。
主要操作:
递归三要素
1.返回值类型和输入参数:
全局变量res记录所有结果,全局变量path记录单个结果,返回值类型为void;
输入参数nums,和起始索引startIndex;
2.终止条件:
如果随着startIndex的不断增加,i会大于等于nums.length,不需要终止条件会自动停止。
3.单层递归逻辑:
3.1记录当前节点值。
3.2使用for循环横向遍历解空间树:
3.2.1判断当前节点是否与前一节点重复,如果是,跳出本次循环;
3.2.2递归纵向遍历解空间树。
3.2.3回溯。
代码大致如下:
public List<List<Integer>>res;
public List<Integer>path;
public List<List<Integer>> subsetsWithDup(int[] nums) {
res=new ArrayList<>();
path=new ArrayList<>();
Arrays.sort(nums);
backTrace(nums,0);
return res;
}
public void backTrace(int[]nums,int startIndex){
res.add(new ArrayList(path));
//终止条件
//if(path.size()>=nums.length)return;
for(int i=startIndex;i<nums.length;i++){
if(i>startIndex&&nums[i]==nums[i-1])continue;
path.add(nums[i]);
backTrace(nums,i+1);
path.remove(path.size()-1);
}
}