排列组合

排列

一般地,从n个不同元素中取出m(m≤n)个元素,按照一定的顺序排成一列,叫做从n个元素中取出m个元素的一个排列(permutation)。特别地,当m=n时,这个排列被称作全排列(all permutation)。

var permute = (nums, k) => {
  let result = [];

  /*
   * 生成排列
   * index表示向当前排列添加第index个元素。
   * p表示当前的排列,其中拥有index-1个元素。
  */
  var generatePermutation = (nums, index, p) => {
    if (index === k) {
      result.push([].concat(p));
      return;
    }
    for (let num of nums) {
      if (p.indexOf(num) < 0) {
        p.push(num);
        generatePermutation(nums, index + 1, p);
        p.pop();
      }
    }
  };

  generatePermutation(nums, 0, []);

  return result;
};

组合

一般地,从n个不同的元素中,任取m(m≤n)个元素为一组,叫作从n个不同元素中取出m个元素的一个组合。

var combine = (nums, k) => {
  let res = [];

  /* 
    * 生成组合
    * start表示需要从数组的start位置开始搜索元素加入当前组合c中。
    * c表示当前的组合。 
    * 当前组合的长度等于k时,组合构造完成。
  */
  var generateCombinations = (nums, start, c) => {
    //当前组合的长度等于k时,保存当前组合
    if (c.length === k) {
      res.push([].concat(c));
      return;
    }
    for (let i = start; i < nums.length; i++) {
      //当前组合添加元素
      c.push(nums[i]);
      //从下一个位置搜索元素
      generateCombinations(nums, i + 1, c);
      //当前组合移除元素
      c.pop();
    }
    return;
  };
  //首次调用,从位置0搜索元素
  generateCombinations(nums, 0, []);

  return res;
};

More

算法之排列组合问题
https://zhuanlan.zhihu.com/p/66930500