排列
一般地,从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