• 【每日算法】回溯法求数组组合


    力扣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 中的所有元素 互不相同

    将题目抽象成一个树,可以看出,我们需要的是这棵树的所有节点。

    回溯三部曲

    • 确定递归参数

    我们需要index来表示遍历的位置

     private void backTracking(int[] nums, int index) {}
    • 单层搜索逻辑

    因为我们要收集每一个节点,所以我们需要在每次回溯的时候,就进行节点的搜集,那么应该在哪一行进行收集呢,应该在循环的前面,因为进入循坏之后就代表着我们就需要将这次循环的数据放在数组里,进行下一次循环了

    1. res.add(new ArrayList<>(path));
    2. for (int i = index; i < nums.length ; i++) {
    3. path.add(nums[i]);
    4. backTracking(nums,i + 1);
    5. path.remove(path.size() - 1);
    6. }
    • 搜索结束条件

    当index大于数组的长度的时候,回溯就结束了

    1. if (index >= nums.length){
    2. return;
    3. }

    完整代码

    1. class Solution {
    2. List> res = new ArrayList<>();
    3. List path = new ArrayList<>();
    4. public List> subsets(int[] nums) {
    5. backTracking(nums,0);
    6. return res;
    7. }
    8. private void backTracking(int[] nums, int index) {
    9. res.add(new ArrayList<>(path));
    10. if (index >= nums.length){
    11. return;
    12. }
    13. for (int i = index; i < nums.length ; i++) {
    14. path.add(nums[i]);
    15. backTracking(nums,i + 1);
    16. path.remove(path.size() - 1);
    17. }
    18. }
    19. }

  • 相关阅读:
    当创建pvc后,kubernetes组件如何协作
    Spring Cloud Alibaba Sentinel 初体验
    AWVS+BP+XRAY三层联动扫描漏洞
    LeetCode每日两题01:有序数组的平方 (均1200道)方法:双指针
    nuc flycontroler dimension
    多项目并行管理:优化协调策略提高效率
    Java线程的学习
    自用的一些网址,码住!
    Linux基础入门到精通之虚拟机网络设置说明
    vue-饼形图-详细
  • 原文地址:https://blog.csdn.net/weixin_57597001/article/details/127579143