算法的经典例题(每天一道算法题)
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集),下面我们就来聊聊关于算法的经典例题?接下来我们就一起去了解一下吧!
![算法的经典例题(每天一道算法题)](http://img.studyofnet.com/upimg/758883275.jpg)
算法的经典例题
先来看下题目给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
这道题是一道典型的考验递归算法的题目,根据题目可以想到,[1,2,3]的子集是[1,2]里面所有的子集和[1,2]里面所有子集和3的组合加上[3]。
解题
var subsets = function(nums) {
// 长度为1时结束递归
if (nums.length === 1) {
return [[], [nums[0]]]
}
// 如果初始的长度就为0,则直接返回[[]]
if (nums.length === 0) {
return [[]]
}
// 取出最后一个数
const nowValue = nums.pop()
// 剩下的数字做递归,找出剩下数字的所有子集
const childSubs = subsets(nums)
// 对所有子集的长度赋值,因为这里会在原数组上做修改,所以先记录了原数组的长度
const subsLength = childSubs.length
// 循环遍历所有子集
for(let i = 0; i < subsLength; i ) {
// 插入当前数和所有子集组合生成的新的子集
childSubs.push([...childSubs[i], nowValue])
}
// 返回结果
return childSubs
};
时间复杂度 O(N*2^N),生成所有子集,并复制到输出结果中。
空间复杂度 O(N*2^N),这是子集的数量。
对于给定的任意元素,它在子集中有两种情况,存在或者不存在(对应二进制中的 0 和 1)。因此,NN 个数字共有 2^N2N 个子集。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com