博客
关于我
子集(LeetCode 78)
阅读量:366 次
发布时间:2019-03-05

本文共 1051 字,大约阅读时间需要 3 分钟。

LeetCode 78:生成所有子集

给定一个包含互不相同元素的集合,返回它的所有子集。结果不能包含相同的子集。

思路

我们可以利用二进制数的特性来生成所有可能的子集。每个二进制数的每一位表示是否包含集合中的一个元素。例如,集合 {1, 2, 3} 中的数字 3(二进制 11)表示包含元素 1 和 2。

具体步骤如下:

  • 确定集合的长度 n。
  • 生成从 0 到 2^n - 1 的所有数字。
  • 对于每个数字 i,检查其二进制表示的每一位:
    • 如果第 j 位为 1,则包含集合中对应的元素 nums[j]。
  • 将这些元素组成一个子集,并将该子集添加到结果中。
  • 解决代码

    #include 
    using namespace std;vector
    > subsets(vector
    nums) { vector
    > res; int n = nums.size(); for (int i = 0; i < (1 << n); ++i) { vector
    temp; for (int j = 0; j < n; ++j) { if (i >> j & 1) { temp.push_back(nums[j]); } } res.push_back(temp); } return res;}

    代码解释

  • 初始化结果集合vector<vector<int>> res; 用于存储所有子集。
  • 确定集合长度int n = nums.size(); 获取集合的大小。
  • 生成所有可能的子集for (int i = 0; i < (1 << n); ++i),循环从 0 到 2^n - 1。
  • 生成子集内容vector<int> temp; 作为临时存储子集的空间。
  • 检查每一位for (int j = 0; j < n; ++j),检查 i 的第 j 位是否为 1。
  • 添加元素到子集if (i >> j & 1),如果第 j 位为 1,则将 nums[j] 添加到 temp。
  • 将子集添加到结果res.push_back(temp);
  • 这种方法通过生成所有可能的二进制数来构建子集,确保每个子集都是唯一的,时间复杂度为 O(n * 2^n),适用于小规模的集合。

    转载地址:http://defwz.baihongyu.com/

    你可能感兴趣的文章
    java基础--继承
    查看>>
    java基础--java内部类
    查看>>
    fastjson 反序列化源码解析
    查看>>
    按位与、或、非、异或总结
    查看>>
    TCP心跳检测包
    查看>>
    18 一个01字符串,求出现0、1出现次数相等的最长子串长度
    查看>>
    01 背包问题
    查看>>
    JVM - 参数配置影响线程数
    查看>>
    idea如何导入一个maven项目
    查看>>
    在 springboot 项目中全局处理异常
    查看>>
    Keil修改Stm32的工程名字
    查看>>
    ILI9341几个重要的命令
    查看>>
    AD如何对原理图进行注释
    查看>>
    力扣:地图分析(多源bfs)
    查看>>
    NC15136: 迷宫
    查看>>
    力扣:搜索旋转排序数组
    查看>>
    动态点击a标签
    查看>>
    java中的泛型
    查看>>
    thymeleaf下拉框回显选中项
    查看>>
    @RequestBody和@RequestParam
    查看>>