代码改变世界

78. 子集

2019-08-06 11:08  前端小白的江湖路  阅读(94)  评论(0编辑  收藏  举报

问题

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]
输出:
[
[3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

解法1

以常规思维来思考,先找出个数为1,然后个数为2,然后个数为3的

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function(nums) {
  let result = [[], ],
    start,
    end;

  for(let i=0; i<nums.length; ++i) {
    result.push([nums[i]]);
  }

  start = 1,
  end = result.length-1;
  for(let m = 0; m<nums.length-1; ++m) {
    end = result.length - 1;
    while(start <= end) {
      let n = nums.indexOf(result[start][result[start].length-1]) + 1;
      for(let i=n; i<nums.length; ++i) {
        result.push([...result[start], nums[i]]);
      }
      start++;
    }
  }
  return result;
};

例如输入[1, 2, 3] ,输出为[[], [1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

解法二

每次新加入一个元素,然后与前面的元素组合

var subsets = function (nums) {
  let result = [[]];
  for(let i=0; i<nums.length; ++i) {
    let len = result.length;
    for(let j=0; j<len; ++j) {
      result.push([...result[j], nums[i]]);
    }
  }
  return result;
}