78. Subsets
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
求数组的所有子集。我用的递归,每一次取数组的最后一个数去构造子集。 递归的过程:1
2
3第一次:[] [3]
第二次:[] [3] [2] [3,2]
第三次:[] [3] [2] [3,2] [1] [3,1] [2,1] [3,2,1]
需要注意的几点 :
每次在子集中添加元素的时候,需要拷贝一份子集,添加元素之后,再将拷贝的数组拼接到结果中。一开始在循环中就直接添加结果,result.length一直在增加,导致了死循环。
拷贝数组的时候注意深拷贝和浅拷贝,直接用等号=复制是浅拷贝,会影响原来的数组的。
concat()方法不会修改原数组,需要把结果存在变量中 4. 在递归中的结果还是需要return一下。这里也不是太明白,每次修改了result结果,又作为一个参数传递下去,继续添加结果。还是需要每次递归的时候return result。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28var subsets = function(nums) {
var result = []
//递归
var dfs = function (nums,result,index,len) {
if(index===len){
return result
}
var last = nums.pop();
if(result.length==0) {
result.push([])
result.push([last])
}else {
var temp = []
for(var i=0; i<result.length; i++){
// temp[i] = result[i] //浅拷贝
temp[i] = [].concat(result[i])
temp[i].push(last)
}
result = result.concat(temp)
}
index = index+1
result = dfs(nums,result,index,len)
return result
}
result = dfs(nums,result,0,nums.length)
return result
};
好像这种方法叫回溯,还有非递归的迭代方法和位运算的方法,看了解答再补充。