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]

需要注意的几点 :

  1. 每次在子集中添加元素的时候,需要拷贝一份子集,添加元素之后,再将拷贝的数组拼接到结果中。一开始在循环中就直接添加结果,result.length一直在增加,导致了死循环。

  2. 拷贝数组的时候注意深拷贝和浅拷贝,直接用等号=复制是浅拷贝,会影响原来的数组的。

  3. 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
    28
    var 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
    };

好像这种方法叫回溯,还有非递归的迭代方法和位运算的方法,看了解答再补充。