给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例 2:
输入:n = 1, k = 1
输出:[[1]]
提示:
1 <= n <= 20
1 <= k <= n
回溯法(时间复杂度为O(C(n,k)),空间复杂度为O(k))。
c++实现
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> result;
vector<int> temp;
backtrackint(n,k,result,1,temp);
return result;
}
void backtrackint(int n,int k,vector<vector<int>>&result,int begin,vector<int>&temp)
{
if(temp.size()==k)
{
result.emplace_back(temp);
return;
}
for(int i=begin;i<=n;i++)
{
temp.push_back(i);
backtrackint(n,k,result,i+1,temp);
temp.pop_back();
}
}
};
java实现
class Solution {
public List<List<Integer>> combine(int n, int k) {
List<List<Integer>> result=new ArrayList<>();
backtracking(n,k,result,1,new ArrayList<>());
return result;
}
private void backtracking(int n,int k,List<List<Integer>> result,int begin,ArrayList<Integer> list)
{
if(list.size()==k)
{
result.add(new ArrayList<>(list));
return;
}
for(int i=begin;i<=n;i++)
{
list.add(i);
backtracking(n,k,result,i+1,list);
list.remove(list.size()-1);
}
}
}
python实现
class Solution:
def combine(self, n: int, k: int) -> List[List[int]]:
result=[]
self.backtracking(n,k,result,1,[])
return result
def backtracking(self,n,k,result,begin,ls):
if(len(ls)==k):
result.append(ls[:])
return
for i in range(begin,n+1):
ls.append(i)
self.backtracking(n,k,result,i+1,ls)
ls.pop()