77-组合(Combinations)
题目描述
中文
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
英文
Given two integers n and k, return all possible combinations of k numbers out of 1 ... n.
示例
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
题目分析
初步分析,返回的是1-n中个数为2的排列组合,组合不能为重复的数字。
if(cur.size() == k){ //如果长度满足k,就把这种结果添加进去
res.add(new LinkedList<>(cur));
}
for(int i = first;i < n+1; ++i){ //求排列
cur.add(i);
put(i+1, k, n, cur);
cur.removeLast(); //回溯
}
把这一部分封装起来,形成一个方法。
public static void put(int first, int k, int n, LinkedList
cur){ if(cur.size() == k){
res.add(new LinkedList<>(cur));
}
for(int i = first;i < n+1; ++i){
cur.add(i);
put(i+1, k, n, cur);
cur.removeLast(); //回溯
}
}
res设置成全局变量,这道题就解决了。
static List
- > res = new LinkedList();
public static List- > combine(int n, int k) {
put(1, k, n, new LinkedList<Integer>());
return res;
}
这道题的重点在回溯 + 剪枝。
还没有评论,来说两句吧...