牛客 二叉树中和为某一值的路径
题目描述
输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。
思路:
DFS回溯算法。回溯算法本质是一个基于DFS的穷举过程
- 往待选结果添加值
- 待选结果是否符合条件 是:添加结果集 (剪枝)
- DFS 深度优先
- 回退 检测下一个
代码:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
void FindPathDFS(TreeNode *root, int expectNumber,vector<vector<int>>&result,vector<int>vec)
{
if(nullptr == root)
return;
vec.push_back(root->val);//添加结果到待选结果中
//条件更新,剪枝
expectNumber -= root->val;
if(expectNumber < 0)
return;
if(root->left == nullptr && root->right == nullptr && expectNumber == 0){
result.push_back(vec);
}
FindPathDFS(root->left, expectNumber,result, vec);
FindPathDFS(root->right, expectNumber,result, vec);
vec.pop_back();//回退的过程
}
vector<vector<int> > FindPath(TreeNode* root,int expectNumber) {
vector<vector<int> > result;
vector<int> vec;
FindPathDFS(root, expectNumber,result,vec);
return result;
}
};
牛客 字符串的排列
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
思路:
代码:
class Solution {
public:
void swap(string &str, int i, int j){
char temp = str[i];
str[i] = str[j];
str[j] = temp;
}
bool IsExist(vector<string> &result, string str){
auto it = result.begin();
for(;it != result.end();++it){
if(*it == str){
return true;
}
}
return false;
}
void PermutationHelper(string &str, int start, vector<string>& result){
if(start == str.length()-1){
if(!IsExist(result, str)){
result.push_back(str);
}
return;
}
for(int i = start;i < str.size();++i){
swap(str, start, i);
PermutationHelper(str, start+1,result);
swap(str, start, i);
}
}
vector<string> Permutation(string str) {
vector<string> result;
if(str.length()>0 ){
PermutationHelper(str, 0, result);
sort(result.begin(), result.end());
}
return result;
}
};
PS:今天的题需要好好理解
优化:用set避免遍历数组去重的步骤,将之前解法中的swap函数去掉,直接在内部进行交换。
代码:
class Solution {
public:
void PermutationHelper(string &str, int start, set<string>& result){
if(start == str.length()-1){
result.insert(str);
return;
}
for(int i = start;i < str.size();++i){
swap(str[start], str[i]);
PermutationHelper(str, start+1,result);
swap(str[start], str[i]);
}
}
vector<string> Permutation(string str) {
set<string> result;
if(str.length()>0 ){
PermutationHelper(str, 0, result);
}
return vector<string>(result.begin(),result.end());
}
};
贴一个大佬的图,方便理解: