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
    }
}
相关推荐
Tbisnic44 分钟前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
Brilliantwxx1 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
空堂与归2 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing3 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习3 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨3 小时前
基础数论总结
笔记·学习·算法
夜不会漫长5 小时前
C++入门(1)
开发语言·c++·算法
wen_zhufeng5 小时前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
大熊背6 小时前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline
一米阳光86616 小时前
软考(中级)软件设计师核心笔记(9)算法——背包问题
笔记·算法·职场发展·软考·软件设计师·中级职称