LeetCode77 组合

链接: https://leetcode-cn.com/problems/combinations/description/

题意

给定一个整数 n 和一个整数 k,求在 1 到 n 中选取 k 个数字的所有组合方法。

解法

比较经典的回溯dfs了,与写一个全排列类似
学习一下新的写法,在下一次搜索的时候直接传入下标
回溯的时候pop_back() 只需要一次递归执行
很巧妙的思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
void comb(int n, int k, vector<int>& temp,vector<vector<int>> &ans, int loc) {
if (temp.size() == k){
ans.push_back(temp);
return;
}
for (int i = loc; i <= n; i++) {
// 取
temp.push_back(i);
comb(n, k, temp, ans, i + 1);
temp.pop_back();
// 不取

}
}
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> ans;
vector<int> temp;
comb(n, k, temp, ans, 1);
return ans;
}
};

补充一个全排列swap写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public:
void backtrack(vector<int>& nums, vector<vector<int>>& ans, int loc) {
if (loc == nums.size() - 1) {
ans.push_back(nums);
return;
}
// 对于每一个当前位置 i 可以将其于之后的任意位置交换
// 然后继续处理位置 i+1 直到处理到最后一位
for (int i = loc; i < nums.size(); i++) {
swap(nums[i], nums[loc]);
backtrack(nums, ans, loc + 1);
swap(nums[i], nums[loc]);
}
}
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>>ans;
backtrack(nums, ans, 0);
return ans;
}
};