leetcode 77. 组合
题目详情
题目链接
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
- 示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
我的代码
class Solution {
private:
vector<vector<int>> results;
int len;
vector<int> nums;
public:
void getAllResults(int start, int k, vector<int> result) {
if (k == 0) {
results.push_back(result);
return;
}
for (int i = start; i + k <= len; ++i) {
auto temp = result;
temp.push_back(nums[i]);
getAllResults(i + 1, k - 1, temp);
}
}
vector<vector<int>> combine(int n, int k) {
nums.resize(n);
len = n;
for (int i = 0; i < n; ++i) {
nums[i] = i + 1;
}
vector<int> result;
getAllResults(0, k, result);
return results;
}
};
我的成绩
执行结果:通过
执行用时:48 ms, 在所有 C++ 提交中击败了47.74%的用户
内存消耗:18.9 MB, 在所有 C++ 提交中击败了18.14%的用户
一些想法
本道题我用的递归。
执行用时为 4 ms 的范例
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> list;
vector<int> result;
dfs(list,result,n,k,0,-1);
return list;
}
void dfs(vector<vector<int>>& list, vector<int>& result, int n, int k, int pos,int pre){
if(pos == k){
list.push_back(result);
return;
}
if((pos + (n-pre)) <= k)return;//剪枝,添加之后用时节省了2/3
//在当前对不合理的取值进行判断,结束下一层的递归操作。
//如果当前剩余可操作数字的个数即(n-pre)< k-pos+1(即组合中有待赋值的位置个数),(+1是因为当前pos还没有进行操作),则可以判断该条路径不可能得到正确的解,不再向下探寻。
for(int i=pre+1; i<n ; i++){
result.push_back(i+1);
pre = i;
dfs(list,result,n,k,pos+1,pre);
result.pop_back();//回溯
}
return;
}
};
思考
参见官方解答