代码随想录刷题学习日记

阅读 29

2024-11-18

仅为个人记录复盘学习历程,解题思路来自代码随想录

代码随想录刷题笔记总结网址:
代码随想录

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);
        }
    }

精彩评论(0)

0 0 举报