Java 求解子集

Posted 南淮北安

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 求解子集相关的知识,希望对你有一定的参考价值。

一、题目

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

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

二、题解

题目要求解集不能包含重复的子集,所以,取过的元素不能重复选取,所以需要设置 index

回溯三部曲

(1)递归函数参数:

全局变量 lists,存放所有的结果
全局变量 list,存放每一次的结果

(2)递归终止条件:

当记录遍历顺序的 index,大于数组长度时,就是集合为空

(3)单层搜索逻辑:

求取子集问题,不需要任何剪枝!因为子集就是要遍历整棵树

三、代码

class Solution 
    // 全局变量存储所有的结果
    List<List<Integer>> lists = new ArrayList<>();
    // 存放每一次的结果
    Deque<Integer> deque = new LinkedList<>();

    public List<List<Integer>> subsets(int[] nums) 
        // 回溯遍历
        backTracking(nums, 0);
        return lists;
    

    public void backTracking(int[] nums, int index) 
        // 加入每一次的结果
        lists.add(new ArrayList(deque));
        // 递归终止
        if (index >= nums.length) 
            return;
        
        for (int i = index; i < nums.length; i++) 
            deque.addLast(nums[i]);
            backTracking(nums, i + 1);
            deque.removeLast();
        
    

四、总结

本地终止条件不写也可以,当 index 大于nums.length 时,for 循环遍历也不满足,会直接结束

以上是关于Java 求解子集的主要内容,如果未能解决你的问题,请参考以下文章

Java 求解一和零

Java 求解划分字母区间

算法题每日一练---第52天:位运算求解子集

78.子集

leetcode 416. 分割等和子集---直接解法

请教一个算法问题