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
    }
}
相关推荐
w_zero_one7 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David7 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David8 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪8 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪8 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
小羊没烦恼!10 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.10 小时前
202609CSP认证P3
算法
云淡风轻~窗明几净11 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
机器学习之心11 小时前
PINN × SVM × NSGA-II × 熵权TOPSIS:一套跑通「建模—优化—决策」的多目标优化框架
算法·机器学习·支持向量机
别动我齐刘海12 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人