BackTrack-----找出一个集合的所有子集(78. Subsets)

原题目
参考博文

深搜dfs用来干很多的事情,比如查找路径,。,(可以尝试所有路径然后找出其中最想要的那一条),数字全排列,找连续子序列的和最大值或者最小值,找出和为XX的连续子序列。

public class Solution {


    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        if (nums == null) {
            return null;
        }
        Arrays.sort(nums);
        List<Integer> item = new ArrayList<>();
        //i控制每个dfs中的itme的数量,也就是说dfs最好拿一个统一的标准来恒定,这个标准就是待会儿用来判定
        //dfs退出的有利条件,可以是子元素个数达到某一值,可以是sum或者其他条件达到某一值
        for (int i = 0; i <= nums.length; i++) {
            item.clear();
            dfs(nums, 0, i, item, result);
        }
        return result;
    }

    /**
     * 管用的深搜
     *
     * @param nums   深搜的数组
     * @param start  起始数字位置
     * @param size   控制的元素大小
     * @param item   子项
     * @param result 结果总list
     */

    public void dfs(int[] nums, int start, int size, List<Integer> item, List<List<Integer>> result) {
        //临界条件
        if (item.size() == size) {
            result.add(new ArrayList<>(item));
            return;
        }
        //尝试每一步
        for (int i = start; i < nums.length; i++) {
            item.add(nums[i]);
            //进行下一步
            dfs(nums, i + 1, size, item, result);
            //回收
            item.remove(item.size() - 1);
        }
    }
}

延伸

找真子集,找不包含XX的真子集,找和为XX的子集

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值