仅为个人记录复盘学习历程,解题思路来自代码随想录
代码随想录刷题笔记总结网址:
代码随想录
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);}}