心得
题解
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(const vector<int>& candidates, int target, int sum, int startIndex) {
if (sum == target) {
result.push_back(path);
return;
}
for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
sum += candidates[i];
path.push_back(candidates[i]);
backtracing(candidates, target, sum, i);
sum -= candidates[i];
path.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
result.clear();
path.clear();
if (candidates.size() == 0) return result;
sort(candidates.begin(), candidates.end());
backtracing(candidates, target, 0, 0);
return result;
}
};
心得
题解
- 相比上题,新增去重操作,好好理解candidate[i] 和candidate[i-1]的去重逻辑
- 可以有连续的相同重复元素,但是不能有单个相同元素选一然后和其他组合的情况,类似连续1 1 1 1 2 4 的情况,可以一直连续,但是不能存在从多个1中选子集(该操作选完后剩下的也可以选类似操作造成重复)
class Solution {
public:
vector<vector<int>> result;
vector<int> path;
void backtracking(vector<int>& candidates, int target, int sum, int startIndex) {
if (sum == target) {
result.push_back(path);
return;
}
for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) {
if (i > startIndex && candidates[i] == candidates[i-1]) {
continue;
}
sum += candidates[i];
path.push_back(candidates[i]);
backtracking(candidates, target, sum, i + 1);
sum -= candidates[i];
path.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
result.clear();
path.clear();
if (candidates.size() == 0) return result;
sort(candidates.begin(), candidates.end());
backtracking(candidates, target, 0, 0);
return result;
}
};
心得
题解
- 模拟组合问题,画出树图,然后画线来类比组合问题
- 注意如何判断回文,如何截取子串,已经startIndex的应用场景,终止条件为遍历结束等
class Solution {
private:
vector<vector<string>> result;
vector<string> path;
void backtracking(const string& s, int startIndex) {
if (startIndex >= s.size()) {
result.push_back(path);
}
for (int i = startIndex; i < s.size(); i++) {
if (isPalindrome(s, startIndex, i)) {
path.push_back(s.substr(startIndex, i - startIndex + 1));
} else {
continue;
}
backtracking(s, i + 1);
path.pop_back();
}
}
bool isPalindrome(const string&s, int start, int end) {
for (int i = start, j = end; i < j; i++, j--) {
if (s[i] != s[j]) {
return false;
}
}
return true;
}
public:
vector<vector<string>> partition(string s) {
result.clear();
path.clear();
if (s.size() == 0) return result;
backtracking(s, 0);
return result;
}
};