【LeetCode每日一题】78.子集

前言

-🏀大家好,我是BXuan,热爱编程与篮球的软件工程大二学生一名
-📚当爱上Coding&&Studying的那一刻…
-🏃‍放弃不难,但坚持一定很酷。


78.子集

难度:中等

🔊题目描述:

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

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

🎱输入输出示例:

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

👓提示:

1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同

🙋‍♀️代码示例:

class Solution {
    // 定义存放结果集
    List<List<Integer>> res = new LinkedList<>();
    // 定义路径集合
    List<Integer> track = new LinkedList<>();

    // 主函数
    public List<List<Integer>> subsets(int[] nums) {
        // 进入回溯函数
        backtrack(nums,0);
        // 返回
        return res;
    }
	// 在对函数进行定义的时候,因为该回溯函数返回的是所有的子集
	// 所以应该对该数组进行二叉树的管理,然后对层数进行调用,与46.全排列题目不同。
    private void backtrack(int[] nums, int start){
        // 直接对结果进行存储
        res.add(new LinkedList<>(track));

        for(int i = start;i < nums.length;i++){
            // 做选择
            track.add(nums[i]);
            // 进入回溯函数
            backtrack(nums,i+1);
            // 撤销选择
            track.remove(track.size()-1);
        }
    }
}

👏小结

回溯算法其实就是暴力穷举的一个过程,转化成二叉树的示意图然后结合是否裁枝以及穷举的一个条件进行遍历。
回溯算法模板:

List<Integer> res;
void backtrack(路径,选择列表){
    if(满足结束条件){
        res.add(路径);
        return;
    }
    for(选择:选择列表){
        做选择;
        backtrack(路径,选择列表);
        撤销选择;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BXuan随笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值