LeetCode一刷:回溯算法-子集

问题描述:

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

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

示例:

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

作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-medium/xv67o6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

分析:

画个草图:

解法:

var backtrack = function(list, tmpList, nums, start) {
    const len = nums.length;
    if(start === len) {
        return;
    }
    for(let i=start; i<len; i++) {
        tmpList.push(nums[i]);
        list.push([...tmpList]);
        for(let j=i+1;j<len;j++) {
          tmpList.push(nums[j]);
          list.push([...tmpList]);
          backtrack(list, tmpList, nums, j+1);
          tmpList.pop();
        }
        tmpList.pop();
    }
};


/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function(nums) {
    var len = nums.length;
    if(len === 0) return [[]];
    var list = [[]];
    backtrack(list, [], nums, 0);
    return list;
};

 改进版:

var backtrack = function(list, tmpList, nums) {
    const len = nums.length;
    if(0 === len) {
        return;
    }
    for(let i=0; i<len; i++) {
        tmpList.push(nums[i]);
        list.push([...tmpList]);
        backtrack(list, tmpList, nums.slice(i+1));
        tmpList.pop();
    }
};


/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function(nums) {
    var len = nums.length;
    if(len === 0) return [[]];
    var list = [[]];
    backtrack(list, [], nums);
    return list;
};

 

原文地址:https://www.cnblogs.com/davidxu/p/13658701.html