代码随想录算法训练营第二十二天 | 77. 组合, 216.组合总和III & 17.电话号码的字母组合
77. Combinations
题目链接: 77. Combinations
题目链接/文章讲解:77. 组合
视频讲解:77. 组合
剪枝操作:回溯算法的剪枝
我的代码:
C++:
class Solution {
private:
vector<vector<int>> result_;
vector<int> path_;
void backtracking(int n, int k, int start) {
if (path_.size() == k) {
result_.push_back(path_);
return;
}
for (int i=start; i <= n - (k - path_.size()) + 1; i++) {
path_.push_back(i);
backtracking(n, k, i+1);
path_.pop_back();
}
}
public:
vector<vector<int>> combine(int n, int k) {
backtracking(n, k, 1);
return result_;
}
};
Python:
class Solution:
def __init__(self):
self.path = []
self.result = []
def combine(self, n: int, k: int) -> List[List[int]]:
def backtracking(n, k, start):
if len(self.path) == k:
self.result.append(self.path.copy())
return
for i in range(start, n+1):
self.path.append(i)
backtracking(n, k, i+1)
self.path.pop()
backtracking(n, k, 1)
return self.result
216. Combination Sum III
题目链接: 216. Combination Sum III
题目链接/文章讲解: 组合总和III
视频讲解:组合总和III
我的代码:
C++:
class Solution {
private:
vector<int> path_;
vector<vector<int>> result_;
void backtracking(int k, int target_sum, int start, int sum) {
if (sum > target_sum) {
return;
}
if (path_.size() == k) {
if (sum == target_sum) {
result_.push_back(path_);
return;
}
}
for (int i = start; i <= 9 - (k - path_.size()) + 1; i++) {
sum += i;
path_.push_back(i);
backtracking(k, target_sum, i+1, sum);
sum -= i;
path_.pop_back();
}
}
public:
vector<vector<int>> combinationSum3(int k, int n) {
path_.clear();
result_.clear();
backtracking(k, n, 1, 0);
return result_;
}
};
17. Letter Combinations of a Phone Number
题目链接:17. Letter Combinations of a Phone Number
题目链接/文章讲解:电话号码的字母组合
视频讲解: 电话号码的字母组合
我的代码:
C++:
class Solution {
private:
const string letterMap[10] = {
"", //0
"", //1
"abc", //2
"def", //3
"ghi", //4
"jkl", //5
"mno", //6
"pqrs", //7
"tuv", //8
"wxyz" //9
};
string path_;
vector<string> result_;
void backtracking(string digits, int index) {
if (index == digits.size()) {
result_.push_back(path_);
return;
}
int digit = digits[index] - '0';
string letters = letterMap[digit];
for (int i=0; i < letters.size(); i++) {
path_.push_back(letters[i]);
backtracking(digits, index + 1);
path_.pop_back();
}
}
public:
vector<string> letterCombinations(string digits) {
path_.clear();
result_.clear();
if (digits.size() == 0) {
return result_;
}
backtracking(digits, 0);
return result_;
}
};
总结
训练营已经结束了,果然没有跟上进度打卡害 但是比上一期已经有进步了!继续加油 争取在接下来两个月补完!然后二刷