原题地址:https://leetcode-cn.com/problems/combinations/submissions/
题目描述:
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
解题方案:
这道题用开始我写的回溯复杂度很高,然后去网上查了一下,发现回溯有一个地方可以改进的就是在遍历的时候,不用一定遍历到n,因为如果解中还差x个数的时候,遍历的部分后面剩余的数一定至少是x个,这样稍微降低了复杂度。然后在网上还找到了动态规划的算法,跑了一下发现也不是最优。。。https://www.cnblogs.com/shine-yr/p/5214849.html
代码:
class Solution {
public:
vector<vector<int>> result;
vector<vector<int>> combine(int n, int k) {
vector<int> temp;
retSeq(n, k, temp, 0);
return result;
}
void retSeq(int n, int k, vector<int> temp, int num)
{
if(num == k)
result.push_back(temp);
else
{
int x;
if(temp.size() == 0)
x = 1;
else
x = temp[temp.size() - 1] + 1;
for(int i = x; i <= n; i ++)
{
temp.push_back(i);
num ++;
retSeq(n, k, temp, num);
num --;
temp.pop_back();
}
}
}
};