当前位置: 首页 > article >正文

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

思路

该问题不是排序问题,for就要从startIndex开始,而不是从0开始求排列问题的时候,才要从0开始,因为集合是有序的。

本题题意就是要求树的所有节点,所以在遍历这棵树的时候把所有节点都记录就行。

回溯法三部曲:

  1. 确定递归函数的参数和返回值。全局变量数组path为子集收集元素,二维数组result存放子集组合。递归参数需要传入原字符串和startIndex,startIndex表示下一轮递归遍历的起始位置。返回值为空。
  2. 确定终止条件。如果起始位置已经大于s的大小,说明已经遍历完成。
  3. 确定单层递归的逻辑。求解子集问题,不需要任何剪枝,因为子集就是要遍历整棵树。

代码

C++版:

class Solution {
public:
    // 回溯法,子集问题
    vector<vector<int>> result;
    vector<int> path;
    void backtracking(vector<int>& nums,int startIndex){
        result.push_back(path); // 收集子集,包括空集
        // 终止条件
        if(startIndex >= nums.size()){
            return ;
        }
        for(int i=startIndex;i<nums.size();i++){
            path.push_back(nums[i]);
            backtracking(nums,i+1);
            path.pop_back();
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        backtracking(nums,0);
        return result;
    }
};

Python版:

class Solution:
    # 回溯法
    def backtracking(self, nums, startIndex, path, result):
        result.append(path[:])  # 收集子集,包括空集
        if startIndex >= len(nums):  # 终止条件
            return
        for i in range(startIndex, len(nums)):
            path.append(nums[i])
            self.backtracking(nums, i + 1, path, result)
            path.pop()
    def subsets(self, nums: List[int]) -> List[List[int]]:
        result = []
        path = []
        self.backtracking(nums, 0, path, result)
        return result

需要注意的地方

1.组合问题和分割问题都是收集树的叶子节点,而子集问题是找树的所有节点。


http://www.kler.cn/a/591031.html

相关文章:

  • Java Stream 流的介绍
  • 【Servo】一个简单的伺服驱动器嵌入式架构,联想
  • JVM G1内存管理核心概念解析:Region、Card Table、CSet与RSet
  • 机试准备第19天
  • Java1.8与testNg兼容问题:bad class file和SocketTimeoutException: Read timed out
  • synchronized底层加锁原理
  • HTTP服务器的工作逻辑
  • 力扣hot100_二分查找(1)_python版本
  • 小样本学习入门指南:以图像识别为例
  • 【数据结构之树】
  • PE(Processing Element,处理单元)在Vitis HLS中的应用与实现
  • 深入理解 Linux 的 top 命令:实时监控系统性能
  • Python绝美樱花树
  • 结合基于标签置信度的特征选择方法用于部分多标签学习-简介版
  • 第18章-综合以上功能 基于stm32的智能小车(远程控制、避障、循迹) 基于stm32f103c8t6_HAL库_CubeMX_超详细,包含代码讲解和原理图
  • Matlab 汽车电子驻车系统仿真分析
  • Java算法之解题套路
  • 超图神经网络的详细解析与python示例
  • 国产编辑器EverEdit - 模式的原理与作用
  • HP LoadRunner 12.02全面性能测试工具的功能与使用指南