本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
输入: nums = [1,2,3]
输出: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
题目解析
思路一
我们这里先创建一个只存储一个解集的数组,在创建一个存储所有解集的空数组,在获取原数组的长度,在定义一个递归方法,参数为下标值,如果递归的当前下标大于等于数组的长度,此递归就返回,在把一个子集存入到最后结果数组中,在子集数组中存入当前下标的原数组值,在递归这个函数(参数,下标值+1),在把子集数组的最后一个值弹出,继续递归这个函数(参数,下标值+1),最后调用这个递归函数(参数为下标值,从0开始),
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
let t = [];
let result = [];
let length = nums.length;
function back(index) {
if(index === length){
result.push(t.slice());
return;
} else {
t.push(nums[index]);
back(index + 1);
t.pop();
back(index + 1);
}
}
back(0);
return result;
};
思路二
我们每次从 nums 挑出来的元素,不能比当前已经挑出来的元素里最大的那个还要大,在通过maxIndex来记录这个当前已经挑出来的元素里最大的那个的位置,下次挑的时候从这里开始迭代最后用 count 记录还要挑几个等于 0 则结束
/**
* @param {number[]} nums
* @return {number[][]}
*/
var subsets = function(nums) {
//存储结果数组
var result = []
//声明函数
var select = (current, count, maxIndex) => {
//判断当前count值是否为0,为0则直接添加到结果数组中
if (count === 0) {
result.push(current)
} else {
for (var i = maxIndex; i < nums.length; i ++) {
select([...current, nums[i]], count - 1, i + 1)
}
}
}
//进行循环调用当前的函数
for (var i = 0; i <= nums.length; i ++) {
select([], i, 0)
}
return result
};