题目

Given a set of distinct integers, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example, If nums = [1,2,3], a solution is:

[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

大致意思

给你一个数组,把这个数组拆分,给出有多少个可能性,并且列出来。

解决方案

这种问题,首先想到的就是利用递归去解决。

  • 首先,声明一个数组,将空数组放进去
var array = [[]];
  • 然后调用combine函数
combine([], nums.slice(0), array);
  • combine函数里,我们将剩下的函数进行遍历
function combine(arr, nums, array) {
  while (nums.length) {
    var data = nums[0];
    var arr_1 = arr.slice(0);
    arr_1.push(data);
    array.push(arr_1);
    nums.shift();
    combine(arr_1, nums.slice(0), array);
  }
}
  • combine函数里,arr里表示需要进行添加的数组,nums表示需要进行combine的数组,array表示最后返回进行push的数组。
[1, 2, 3]  --> ([1], [2, 3]) --> ([1, 2], [3]) --> ([1, 2, 3])
                             --> ([1, 3])

源代码

var subsets = function(nums) {
  var array = [[]];

  combine([], nums.slice(0), array);

  return array;
};

function combine(arr, nums, array) {
  while (nums.length) {
    var data = nums[0];
    var arr_1 = arr.slice(0);
    arr_1.push(data);
    array.push(arr_1);
    nums.shift();
    combine(arr_1, nums.slice(0), array);
  }
}