子集

102 阅读1分钟

题目描述

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

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

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

示例 2:

输入: nums = [0]
输出: [[],[0]]

思路

  1. 画出抽象树结构

image.png

  1. 由抽象树,我们可以看出,我们所需要的结果是每层递归的结果,这也是本题与组合,组合总和,切割它们需要的结果是叶子节点的结果)问题的区别。

  2. 回溯三部曲:

    • 传参:nums:数组,startIndex:每次递归遍历开始的位置;返回值:void
    • 终止条件:startIndex==nums.length
    • 单层递归逻辑

代码

function subsets(nums: number[]): number[][] {
   let result=[],path=[];//结果数组,路径数组
   result.push([]);
   function backTracking(nums: number[],startIndex:number): void{
       //终止条件
       if(startIndex==nums.length){
           return;
       }

       for(let i=startIndex;i<nums.length;i++){
           path.push(nums[i]);
           result.push([...path]); //收割每层递归结果
           backTracking(nums,i+1);
           path.pop(); // 回溯操作
       }
   }

   backTracking(nums,0)
   return result;
};

image.png

总结

组合,组合总和,切割,子集问题首先想到回溯算法。但子集问题,需要收割的是每层递归的结果。