当前位置 博文首页 > 庆述倾述:子集Java——回溯法

    庆述倾述:子集Java——回溯法

    作者:[db:作者] 时间:2021-08-05 12:50

    刷题记录第24题,上一题:1~n 整数中 1 出现的次数,本题地址:子集。

    给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

    解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

    示例 1:

    输入:nums = [1,2,3]
    输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
    示例 2:

    输入:nums = [0]
    输出:[[],[0]]

    思路:每次固定窗口大小,进行该窗口下的组合,使用回溯法可以找到所有:

    class Solution {
        public List<List<Integer>> subsets(int[] nums) {
            List<List<Integer>> res = new ArrayList<List<Integer>>();
            int windowSize = 0;
            while(windowSize <= nums.length){
                if(windowSize == 0){
                    res.add(new ArrayList<Integer>());
                }else{
                    getResult(nums, new ArrayList<Integer>(), 0, windowSize,  res);
                }
                windowSize++;
            }
            return res;
        }
    
        private void getResult(int[] nums, ArrayList<Integer> integers,int start,
                               int winSize, List<List<Integer>> res) {
            ArrayList<Integer> list = new ArrayList<Integer>(integers);
            if(integers.size() == winSize){
                res.add(list);
            }else{
                for (int i = start; i < nums.length; i++) {
                    list.add(nums[i]);
                    getResult(nums, list, i + 1, winSize, res);
                    list.remove(list.size() - 1);
                }
            }
        }
    }
    

    因为要去除重复,故而在回溯的时候不能在去取前面的数字,以保证不重复。

    如果要求顺序,就可以使用一个访问数组,每次遍历从0开始,没访问过就加入。

    cs
    下一篇:没有了