LeetCode 78. 子集

leetcode.cn/problems/su...

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

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

示例 1:

ini 复制代码
输入: nums = [1,2,3]
输出: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

示例 2:

lua 复制代码
输入: nums = [0]
输出: [[],[0]]

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

方法1:递归

代码

遍历写法:

kotlin 复制代码
class Solution {
    fun subsets(nums: IntArray): List<List<Int>> {
        val resultList = mutableListOf<List<Int>>()
        // 在输出结果中加入空集
        resultList.add(listOf())
        for (i in nums) {
            val newSubsetList = mutableListOf<List<Int>>()
            for (ints in resultList) {
                // 复制结果中已经存在的子集
                val newSubset = mutableListOf<Int>()
                newSubset.addAll(ints)
                // 加入当前整数
                newSubset.add(i)
                // 加入输出结果
                newSubsetList.add(newSubset)
            }
            resultList.addAll(newSubsetList)
        }
        return resultList
    }
}

递归写法:

kotlin 复制代码
class Solution {
    fun subsets(nums: IntArray): List<List<Int>> {
        return recurse(cur = nums.size, nums = nums)
    }

    // 返回 nums 中前 cur 个数的所有子集
    fun recurse(cur: Int, nums: IntArray): List<List<Int>> {
        val result = mutableListOf<List<Int>>()
        // 前 0 个数的子集为 [[]]
        if (cur == 0) {
            result.add(listOf())
            return result
        }
        // 前 cur-1 个数中所有子集
        val existingResult = recurse(cur - 1, nums)
        result.addAll(existingResult)
        for (ints in existingResult) {
            val newSubset = mutableListOf<Int>()
            newSubset.addAll(ints)
            // 加入一个新的数
            newSubset.add(nums[cur - 1])
            result.add(newSubset)
        }
        return result
    }
}

方法2:回溯

kotlin 复制代码
class Solution {
    val result = mutableListOf<List<Int>>()
    var n: Int = 0

    fun subsets(nums: IntArray): List<List<Int>> {
        n = nums.size
        for (k in 0..n) {
            backtrack(0, k, mutableListOf(), nums)
        }
        return result
    }

    /**
     * start 为子集第一个数在 nums 中最早可以出现的位置
     * k 为当前需要构造子集的长度
     * cur 储存当前正在构造的子集
     * backtrack 运行一次能够构造所有长度为 k 的子集
     */
    fun backtrack(start: Int, k: Int, cur: MutableList<Int>, nums: IntArray) {
        // 当前子集构造完成
        // 将 cur 中的子集加入输出结果
        if (k == 0) {
            val subset = mutableListOf<Int>()
            subset.addAll(cur)
            result.add(subset)
            return
        }
        for (i in start..<n) {
            // 把数组中第 i 个数加入当前子集
            cur.add(nums[i])
            // 从 i+1 位置开始继续构建当前子集
            backtrack(i + 1, k - 1, cur, nums)
            // 把这步加入的数字从数组中移除
            cur.removeAt(cur.size - 1)
        }
    }
}

方法3:字典排序子集

kotlin 复制代码
class Solution {
    fun subsets(nums: IntArray): List<List<Int>> {
        val result = mutableListOf<List<Int>>()
        val n = nums.size

        for (i in 2f.pow(n).toInt()..<2f.pow(n + 1).toInt()) {
//            生成 01 字符串
//            bitmask = 000
//            bitmask = 001
//            bitmask = 010
//            bitmask = 011
//            bitmask = 100
//            bitmask = 101
//            bitmask = 110
//            bitmask = 111
            val bitmask = Integer.toBinaryString(i).substring(1)
            val subset = mutableListOf<Int>()
            for (j in 0..<n) {
                // 对于 nums 中的每个数,如果字符串中该数位为1则加入子集,反之则跳过
                if (bitmask[j] == '1') {
                    subset.add(nums[i])
                }
            }
            result.add(subset)
        }
        return result
    }
}
相关推荐
DuHz2 小时前
论文解读:用于数据分析的极值点对称模态分解方法 (Extreme-point Symmetric Mode Decomposition,ESMD)
论文阅读·算法·信息与通信·信号处理
HZZD_HZZD2 小时前
用电负荷聚类分析实战:基于`scikit-learn`的`K-Means`与`DBSCAN`双算法对比、`PCA`降维可视化与智能电表负荷画像全流程
算法·scikit-learn·kmeans
MIngYaaa5202 小时前
2026暑期牛客多校1 2026-7-17
数据结构·算法
wabs6662 小时前
关于图论【卡码网107.寻找存在的路线的思考】
数据结构·算法·图论
半兽先生3 小时前
大模型技术开发与应用——4.大模型提示词工程实战
人工智能·算法
wuminyu3 小时前
JUC组件逐层剥离与深度剖析
java·linux·c语言·jvm·c++·算法
XiaoYu1__3 小时前
算法进阶·其二:用欧拉路径解决“一笔画”问题并建模转化De Bruijn序列的构造问题
c++·笔记·算法·欧拉路径
hhzz3 小时前
机器学习-算法模型系列文章:07-SVM 一巴掌拍出来的超平面:SVM核函数选错,再干净的数据也救不了你
算法·机器学习·支持向量机
geovindu4 小时前
java: Gale-Shapley Algorithm
java·开发语言·后端·算法