leetcode hot100子集

leetcode hot100子集_第1张图片
在本题中,是要求一个集合的子集,那么可以采用回溯算法来进行解决。但是,这里和之前的组合问题不同的地方在于,这里并没有明确给出k的值,也就是说没有明确告诉每一个结果中所含有的数字的个数。那么,也就是说,只要其长度小于整个集合,都是子集,而且空集也是子集。

以往回溯算法的组合问题,我们都是在叶子节点才收割结果的,因为只有向下递归k层之后,才能得到想要的组合。但是这个题中,我们在每一个节点都需要收割结果,因为每一个节点的结果都是我们所需要的子集。
leetcode hot100子集_第2张图片
所以,我们向结果二维数组中添加的时候,就需要在递归函数的一开始添加,这样保证,每下一次递归的时候,会把上一次的结果给存入到二维数组中!

然后进行递归三部曲

  1. 确定参数和返回值:一般返回值都是void,然后我们需要题中的数组,还需要一个startIndex,作为起始索引,用来一直更新选取元素的位置。
  2. 确定终止条件:也就是当我们这个起始索引,逐步移动,当移动到数组的最后一个元素的下一位,这时候已经没有元素可以选取了,此时也就结束了,也就是startIndex == nums.length;
  3. 确定单层递归的逻辑:首先根据上述,需要先保存结果,然后进行for循环,然后递归下一个位置,然后回溯。
class Solution {
    List> result = new ArrayList<>();// 存放符合条件结果的集合
    LinkedList path = new LinkedList<>();// 用来存放符合条件结果
    public List> subsets(int[] nums) {
        subsetsHelper(nums, 0);
        return result;
    }

    private void subsetsHelper(int[] nums, int startIndex){
        result.add(new ArrayList<>(path));//「遍历这个树的时候,把所有节点都记录下来,就是要求的子集集合」。
        if (startIndex >= nums.length){ //终止条件可不加
            return;
        }
        for (int i = startIndex; i < nums.length; i++){
            path.add(nums[i]);
            subsetsHelper(nums, i + 1);
            path.removeLast();
        }
    }
}

你可能感兴趣的:(leetcode,算法,职场和发展)