回溯问题

78. 子集

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

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

示例:

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

var subsets = function(nums) {
    var res = [];
    var track = [];
    var backtrack = function(index,track) {
        res.push([...track]);
        for(var i=index;i<nums.length;i++){
            track.push(nums[i]);
            backtrack(i+1,track);
            track.pop()
        }
    }
    backtrack(0,track)
    return res;
};

46. 全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]
/**
 * @param {number[]} nums
 * @return {number[][]}
 */

var permute = function(nums) {
    var res = [];
    var track = [];
    var backtrack = function(nums,track){
        if(track.length == nums.length){
            res.push([...track]);
            return;
        }
        for(var i=0;i<nums.length;i++){
            if(track.includes(nums[i])){
                continue;
            }
            track.push(nums[i]);
            backtrack(nums,track);
            track.pop()
        }
    }
  backtrack(nums,track);
  return res;
};

47. 全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

输入:nums = [1,1,2]
输出:
[[1,1,2],
 [1,2,1],
 [2,1,1]]
示例 2:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permuteUnique = function(nums) {
    var res = [];
    var track = [];
    var vis = [];
    nums.sort((a, b) => a - b); 
    var backtrack = function(nums,track){
        if(track.length == nums.length){
            res.push([...track]);
            return;
        }
        for(var i=0;i<nums.length;i++){
          if(vis[i]){
              continue
          }
          if(i>0&&nums[i]==nums[i-1]&&!vis[i-1]){
              continue
          }
         track.push(nums[i]);
         vis[i]=true;
         backtrack(nums,track);
         track.pop();
         vis[i]=false;
        }
    }
  backtrack(nums,track);
  return res;
};

77. 组合

给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。

示例:

输入: n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]
/**
 * @param {number} n
 * @param {number} k
 * @return {number[][]}
 */
var combine = function(n, k) {
  if(n<=0||k<=0)return [];
  var res = [];
  var track = [];

  var backtrack = function(index,k,track){
      if(k==track.length){
          res.push([...track]);
          return;
      }
      for(var i=index;i<=n;i++){
          track.push(i);
          backtrack(i+1,k,track);
          track.pop();
      }
  }
  backtrack(1,k,[]);
  return res;
};
posted @ 2020-12-18 20:08  拉肥尔  阅读(102)  评论(0)    收藏  举报