39. 组合总和
题目链接:https://leetcode.cn/problems/combination-sum/submissions/
代码:
class Solution {
public:
vector<vector<int>> result;
vector<int> tmp;
int sum = 0;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
group(tmp,0,target,0,candidates);
return result;
}
void group(vector<int> tmp, int sum, int target, int startIndex, vector<int> candidates)
{
if(sum > target || startIndex == candidates.size())
return;
if(sum == target)
{
result.push_back(tmp);
return;
}
for(int i = startIndex; i < candidates.size(); i++)
{
tmp.push_back(candidates[i]);
sum += candidates[i];
group(tmp, sum, target, i, candidates);
sum -= candidates[i];
tmp.pop_back();
}
}
};
优化后:
class Solution {
public:
vector<vector<int>> result;
vector<int> tmp;
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
group(tmp,0,target,0,candidates);
return result;
}
void group(vector<int> tmp, int sum, int target, int startIndex, vector<int> candidates)
{
if(sum == target)
{
result.push_back(tmp);
return;
}
for(int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++)
{
tmp.push_back(candidates[i]);
sum += candidates[i];
group(tmp,sum,target,i,candidates);
sum -= candidates[i];
tmp.pop_back();
}
}
};
40.组合总和II
题目链接:https://leetcode.cn/problems/combination-sum-ii/
代码:
class Solution {
public:
vector<vector<int>> result;
vector<int> tmp;
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
sort(candidates.begin(),candidates.end());
group(candidates,0,target,0);
return result;
}
void group(vector<int> candidates, int sum, int target, int startIndex)
{
if(sum == target)
{
result.push_back(tmp);
return;
}
for(int i = startIndex; i < candidates.size() && sum + candidates[i] <= target ; i++)
{
if(i > startIndex && candidates[i] == candidates[i-1])
continue;
tmp.push_back(candidates[i]);
sum += candidates[i];
group(candidates,sum,target,i+1);
sum -= candidates[i];
tmp.pop_back();
}
}
};
注意下面这句话,是降重的关键:
if(i > startIndex && candidates[i] == candidates[i-1])
continue;
131.分割回文串
题目链接:https://leetcode.cn/problems/palindrome-partitioning/
代码:
class Solution {
public:
vector<vector<string>> result;
vector<string> tmp;
vector<vector<string>> partition(string s) {
split(s,0);
return result;
}
void split(string s, int startIndex)
{
if(startIndex >= s.size())
{
result.push_back(tmp);
return;
}
for(int i = startIndex; i < s.size(); i++)
{
if(ifTrue(s,startIndex,i))
{
string str = s.substr(startIndex, i - startIndex + 1);
tmp.push_back(str);
}else continue;
split(s,i+1);
tmp.pop_back();
}
}
bool ifTrue(string s,int start,int end)
{
while(start < end)
{
if(s[start] != s[end])
return false;
start++;
end--;
}
return true;
}
};
这个还不太会 需要复习一下