法1
想法:
- 大问题包含小问题,大小问题是同一种类型
- 组合而非排列,那么某一组合出现之后,另一组合不能与其相同(元素完全相同)。如何保证?已经当了某一组合第一个元素的数字,不能在加入后面的组合中。因为从1到n,为升序排列,则优先小数字先当组合的第一个元素,然后得到剩余数字的组合,与该数字拼接。1到n的升序也保证了,前面已经加入的数字不会再次加入剩余数字的组合中
/**
* @param {number} n
* @param {number} k
* @return {number[][]}
*/
var combine = function(n, k) {
var output = [], temp = [];
var i = 0;
for(i = 1; i <= n; i++) {
temp.push(i); // 当前数字加入,剩余数字组合
doCombine(i + 1, n, k - 1, temp, output);
temp.pop();
}
return output;
};
function doCombine(l, h, k, temp, output) {
if(h - l + 1 < k) { // 如果当前剩余数字数小于k,那么直接返回
return;
}
if(k == 0) { // k等于0,当前temp中的数字个数以满足要求
output.push(temp.concat([]));
return;
}
var i = 0;
for(i = l; i <= h; i++) {
temp.push(i); // 当前数字加入,剩余数字组合
doCombine(i + 1, h, k - 1, temp, output);
temp.pop();
}
}