题目链接:
https://leetcode-cn.com/problems/combinations/
难度:中等
77. 组合
给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
示例:
输入: n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
難しく
ないか、再帰的に便利ではありません。。。
class Solution {
public:
vector<vector<int>> ans;
vector<int> curvec;
vector<vector<int>> combine(int n, int k) {
dfs(1,n,k);
return ans;
}
void dfs(int cursize,int n,int k){
if(curvec.size()==k){
ans.push_back(curvec);
return;
}
if(curvec.size()+n-cursize+1<k){
return;
}
curvec.push_back(cursize);
dfs(cursize+1,n,k);
curvec.pop_back();
dfs(cursize+1,n,k);
}
};
再帰は確かに単純であり、別の方法は本当に予想外です。。。レコードの座標の説明
は、次に忘れたときの見積もりをほとんど理解していません
原序列中被选中的数 对应的二进制数 方案
4 3 [2] [1] 0011 2, 1
4 [3] 2 [1] 0101 3, 1
4 [3] [2] 1 0110 3, 2
[4] 3 2 [1] 1001 4, 1
[4] 3 [2] 1 1010 4, 2
[4] [3] 2 1 1100 4, 3
終わりは1:のように... 0 {1 …1 **} **:Exchange 0 1(終わりに1だけを含む文字列があり、文字列の最初の1を1の前の0と交換します)、
終わりは0です:など... 0 {1 …1} {0…0}:0から1に交換し、メソッドの最後に残りの1を残します:…10 {0…0} {…1}(最後は0であり、0の文字列の前に0のみの文字列が必要です) 1の文字列もあります。1の最初の位置を前の0と交換し、残りの1を最後に置き
ます){1 ... 1}:1- {0 ... 0}のみを含む文字列:のみ1を含む文字列
次のコードは、現在選択されている数値を保存するための余分なメモリの使用を巧みに回避します
(バイナリの0は選択されていないことを意味し、1は対応するコードを選択することを意味します。1はcurvec [i] + 1 ==を意味します。 curvec [i + 1]、および0は、curvec [i] +1!= curvec [i + 1]を意味します)
class Solution {
public:
vector<int> curvec;
vector<vector<int>> ans;
vector<vector<int>> combine(int n, int k) {
for (int i=1;i<=k;++i) {
curvec.push_back(i);
}
// 这里必须是 n+1
curvec.push_back(n+1);
int i=0;
while(i<k){
ans.emplace_back(curvec.begin(),curvec.begin()+k);
i=0;
while(i<k&&curvec[i]+1==curvec[i+1]){
curvec[i]=i+1;
i++;
}
curvec[i]++;
}
return ans;
}
};