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
    }
}
相关推荐
好悬给我拽开线1 小时前
ZILOT 论文解析
算法
饮水桶_T2 小时前
JAVA IO流笔记
开发语言·数据结构·算法
星夜离尘563 小时前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Pniubi3 小时前
力扣76.最小覆盖子串
算法·leetcode·职场和发展
地平线开发者4 小时前
征程6|用 hrt\_model\_exec 看清 YOLOv5x 的输入、原始输出和后处理
人工智能·算法
csdn_aspnet4 小时前
C++ 3个有序点的方向(Orientation of 3 ordered points)
c++·算法
赤生云电竞5 小时前
GPU算力共享平台架构实践:任务分发与资源隔离的关键配置
算法·架构·gpu算力
青少儿编程课堂6 小时前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:折半搜索优化子集枚举(Meet in the Middle)解析
c++·python·算法·bfs·信息学竞赛
Oneshot8 小时前
DLX(Dancing Links)算法详解:求解数独最快的算法
算法
青少儿编程课堂9 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会Scratch考级:校园连连看解析
c++·python·算法·bfs·信息学竞赛