Leetcode笔记目录
一、题目描述
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例1:
- 输入: n = 4, k = 2
输出: [
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
二、解题过程
1.思想
回溯法的经典题目,与Leetcode46十分相似,不同点在于:
- 增加了k的限制;
- 输入的仅仅是一个int,Leetcode46输入的是一个数组,这要求我们自己写一个vector;
- 最关键的结构没变,即for(int i=level;i<n;i++)。
2.代码
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> results;
vector<int> result;
backtrace(n,k,1,result,results);
return results;
}
void backtrace(int n,int k,int level,vector<int>& result,vector<vector<int>>& results){ //错误2
if(result.size()==k){
results.push_back(result);
return;
}
for(int i=level;i<=n;i++){
result.push_back(i); //错误1
backtrace(n,k,i+1,result,results);
result.pop_back();
}
}
- 错误
- vector定义的方式决定了添加元素的方式,若没有规定大小,就不能用传统数组的方式增加元素。
- 注意函数定义时有的形参加上&,因为我们需要引用传递。
三、总结
注意与Leetcode46作比较,体会不同的输入对写法的影响,以及关键写法并没有改变。