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

来源:互联网 发布:机器人编程语言py 编辑:程序博客网 时间:2024/06/03 12:51

原题目
参考博文

深搜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的子集

0 0
原创粉丝点击