39. Combination Sum
这个题和前面几个题还是有点像,一开始自己写的时候两点没注意到,具体代码更改在下面运行代码的注释中。主要注意排列与组合的差别,另外就是递归边界条件;
//如果是一个集合来求组合的话,就需要startIndex;如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex
class Solution {
public:
vector<vector<int>> result;
vector<int> temp;
int sum=0;
void sum_function(vector<int>& candidates, int target,int sum, int start_index){
if(sum>target){
return;
}//这一段一开始没写,直接报内存的错,估计是栈溢出了
if(sum == target){
result.push_back(temp);
return;
}
for(int i =start_index;i<candidates.size();i++){
//这个题一开始没有弄一个startindex的参数,做出来的结果是 有那种233, 232这种重复的情况的,carl前一题的视频中说过这种情况根据i的数据调整 startposition.
sum+= candidates[i];
temp.push_back(candidates[i]);
sum_function(candidates,target,sum,i);
sum-= candidates[i];
temp.pop_back();
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
sum_function(candidates,target,0,0);
return result;
}
};
40. Combination Sum II
“去重” 要对数组进行排序,要让同样的元素排在一起;
另外去重操作要在树层上进行,不能对树枝上进行进行;另外创建了一个used数组来判断是在树脂还是树层,这个要理解下;
class Solution {
public:
vector<vector<int>> result;
vector<int> temp;
int sum=0;
void sum_function(vector<int>& candidates, int target,int sum, int start_index,vector<bool>& used){
if(sum>target){
return;
}
if(sum == target){
result.push_back(temp);
return;
}
for(int i =start_index;i<candidates.size();i++){
if (i > 0 && candidates[i] == candidates[i - 1] && used[i - 1] == false) {
continue; //这里就是符合去重的标准的时候直接跳出这次循环;
}
sum+= candidates[i];
temp.push_back(candidates[i]);
used[i]=true;
sum_function(candidates,target,sum,i+1,used);
used[i]=false;
sum-= candidates[i];
temp.pop_back();
}
}
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<bool> used(candidates.size(), false);
sort(candidates.begin(), candidates.end());
sum_function(candidates,target,0,0,used);
return result;
}
};
131. Palindrome Partitioning
注意用[startindex, i] 来进行字符串的分割; 另外创建一个函数用双指针法来判断是不是回文字符串
class Solution {
public:
// vector<int> path; 这里搞错了
// vector<vector<int>> result;
vector<string> path;
vector<vector<string>> result;
bool Palindrome(string &s,int start, int end){
while(start< end){
if(s[start]!=s[end])
{return false;}
else{
start++;
end--;
}
}
return true;
}
void backtracking(string &s, int start_index){
if(start_index == s.size()) {
result.push_back(path);
return;
}
for(int i=start_index;i<s.size();i++){
if(Palindrome(s,start_index,i)){
string str=s.substr(start_index, i-start_index+1);
//path.push_back(s[i]); 这行写错了这个题要把这一段的数字都取出来,所以重新定义了一个变量
path.push_back(str);
}else{
continue;
}
backtracking(s,i+1);
path.pop_back();
}
}
vector<vector<string>> partition(string s) {
backtracking(s,0);
return result;
}
};