题1:
指路:LeetCode77 组合
思路与代码:
对于这个题第一反应还是嵌套循环,但首先需要解决的就是控制输出中大数组中小数组内元素的个数。很显然,这个题直接暴力无法控制,那么我们试试另一种暴力——回溯。对于在n个数中选k个的组合问题,我一开始很难想象这么弄,但直到看到卡哥给出的图我才猛然记起当时数据结构里面学过。这里先不画了,大家感兴趣可以去卡哥网站看看。在这里我们定义一个二维数组放最终的结果,一个一维数组放里面符合条件的小结果。终止条件为选取的元素个数等于k,这时候把这个组合放进最终的结果集result里面。单层循环逻辑为小结果键入元素,然后递归下一个元素,最后回溯弹出已有组合使其接收下一组符合条件的结果。代码如下:
class Solution {
private:
vector<vector<int>> result;
vector<int> path;
void backtracking(int n, int k, int startindex) {
if (path.size() == k) { // k控制个数
result.push_back(path);
return ;
}
for (int i = startindex; i <= n; i++) {
path.push_back(i);
backtracking(n, k, i + 1);
path.pop_back(); // 回溯弹出已有组合
}
}
public:
vector<vector<int>> combine(int n, int k) {
backtracking(n, k, 1);
return result;
}
};
第一天正式写回溯,有点不太适应,希望之后可以得心应手。