本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
二、思路分析
首先根据题目描述我们可以确认的要求有:
- 获取输入数组 nums 的所有子集
- 子集是不重复的
然后根据上述要求我们可以知道,该题是有 出路 和 死路 的,所以可以优先考虑回溯算法。
最后,我们可以使用递归来模拟出所有的情况,并且保证子集中数组元属的顺序是和 nums 一致的,收集到所有到达递归终点的情况后,返回即可。
三、AC 代码
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
const res = [] // 返回的内容
/**
* 回溯
* @param {number[]} 路径
* @param {number} 路径长度
* @param {number} 起始位置
* @return {number[][]}
*/
const backtrack = (path, l, start) => {
// 判断当前路径长度是否和指定长度一致
// 如果是,则收集数据并直接返回
if(path.length === l) {
return res.push(path)
}
// 使用递归模拟所有的情况
// start 用来确保元素顺序的正确性
for(let i = start; i < nums.length; i++) {
backtrack(path.concat(nums[i]), l, i + 1)
}
}
// 通过遍历去收集长度分别为 0、1、2、...、nums.lengt 的数据
for(let i = 0; i <= nums.length; i++) {
backtrack([], i, 0)
}
// 返回收集到的内容
return res
};
四、总结
实际上需要关注的就是,如何判断去判断判断子集的唯一性和有效性,也就是使用 start 来保证元素顺序的正确性
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情