LeetCode77-组合
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
一、回溯算法
很明显的回溯特征,凡是要求列出全部的可能的题目都可以用回溯算法解决
并且数字都是有序的,可以加以利用,使得确保:
这里注意,传入向量时要加上引用,可以加快算法的运行,并且减少内存的消耗:
C++代码:
class Solution {
public:
vector<vector<int>> ans;
vector<vector<int>> combine(int n, int k) {
if (k > n)
return ans;
vector<int> nums;
recrusion(n, k, 0, nums);
return ans;
}
void recrusion(int n, int k, int pre, vector<int>& nums) {
if (nums.size() == k) {
ans.push_back(vector<int>(nums.begin(), nums.end()));
return;
}
for (int i = pre + 1; i <= n; i++) {
nums.push_back(i);
recrusion(n, k, i, nums);
nums.pop_back();
}
return;
}
};
执行效率:
加不加引用的差距:
132ms 对比 1224ms