2020_12_18 Leetcode刷题
今日刷了三道LeetCode题目,简单记录。
简单模拟题。直接对于两个字符串进行排序,之后一个个对比即可。如果在对比的过程中都正确,则是最后一个字符,进行特殊处理。
class Solution {
public:
char findTheDifference(string s, string t) {
sort(s.begin(),s.end());
sort(t.begin(),t.end());
int len1 = s.length();
bool flag = false;
char ans;
for(int i = 0;i < len1; i++) {
if(s[i] == t[i])
continue;
else {
flag = true;
ans = t[i];
break;
}
}
if(!flag)
ans = t[len1];
return ans;
}
};
递归回溯题。一开始写的时候想法是在当节点为空的时候存储路径,但是发现正确的应该是在当左右两个节点都为空的时候,存储路径,于是确定思路,在回溯过程中分别判定左右子树结构,之后再判定是否需要回溯。numtostring函数依旧是用于将数字转换为字符串。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<string> binaryTreePaths(TreeNode* root) {
string temp = "";
vector<string> ans;
if(root == nullptr)
return ans;
temp = temp + numtostring(root->val);
if(root->left != nullptr)
DfsTree(root->left,ans,temp);
if(root->right != nullptr)
DfsTree(root->right,ans,temp);
if(root->left == nullptr && root->right == nullptr)
ans.push_back(temp);
return ans;
}
void DfsTree(TreeNode* root,vector<string>& ans,string temp) {
if(root == nullptr)
return;
temp = temp + "->" + numtostring(root->val);
if(root->left != nullptr)
DfsTree(root->left,ans,temp);
if(root->right != nullptr)
DfsTree(root->right,ans,temp);
if(root->left == nullptr && root->right == nullptr)
ans.push_back(temp);
return;
}
string numtostring(int num) {
string ans = "";
if(num > 0)
ans = to_string(num);
if(num == 0)
ans = "0";
if(num < 0)
ans = "-" + to_string(abs(num));
return ans;
}
};
递归,技巧题。简单难度的树形树形结构一般都是递归回溯法,所以第一思路也是写一个回溯函数,存储节点,之后遍历节点然后寻找相同的节点,但是在存储节点的代码实现上卡壳,不太确定如何在遍历的过程中,存储路径节点,所以未完成。查看题解,发现题解的方法二巧妙的利用了二叉搜索树的性质,实现了任务,记录一下,第二天再次练习这道题。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* ans = root;
while(true) {
if(p->val < ans->val && q->val < ans->val)
ans = ans->left;
else {
if(p->val > ans->val && q->val > ans->val)
ans = ans -> right;
else
break;
}
}
return ans;
}
};