摘要: 题目: 解答: 思路:哈希。 需要满足两个条件: 两个字符串长度相同; 两个字符串中包含的相同字符,数量相同; 1 class Solution { 2 public: 3 bool CheckPermutation(string s1, string s2) 4 { 5 if (s1.size() 阅读全文
posted @ 2020-05-03 23:25 梦醒潇湘 阅读(220) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 class Solution { 2 public: 3 int removePalindromeSub(string s) 4 { 5 if (s.size() == 0) 6 { 7 return 0; 8 } 9 for (int left = 0, right = s.s 阅读全文
posted @ 2020-05-03 23:20 梦醒潇湘 阅读(200) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 class Solution { 2 public: 3 string freqAlphabets(string s) 4 { 5 string ans; 6 for (int i = 0; i < s.size(); ++i) 7 { 8 if (i + 2 < s.size( 阅读全文
posted @ 2020-05-03 23:15 梦醒潇湘 阅读(198) 评论(0) 推荐(0)
摘要: 题目: 解答: 把L看作1,R看作-1,构建前缀和,当前缀和为0时,说明LR个数相等。返回前缀和中0的个数。 1 class Solution { 2 public: 3 int balancedStringSplit(string s) 4 { 5 if (s.size() < 2) 6 { 7 阅读全文
posted @ 2020-05-03 23:13 梦醒潇湘 阅读(193) 评论(0) 推荐(0)
摘要: 题目: 解答: 思路就是先计算每个字符串中,26个字母每个出现的次数(fun函数的功能),然后就是二分查找找出答案。这里二分查找用的函数是标准库的 upper_bound。 1 class Solution { 2 public: 3 vector<int> numSmallerByFrequenc 阅读全文
posted @ 2020-05-03 23:00 梦醒潇湘 阅读(182) 评论(0) 推荐(0)
摘要: 题目: 解法: 1 class Solution { 2 public: 3 string defangIPaddr(string address) 4 { 5 string res ; 6 7 for ( char c : address ) 8 { 9 if ( c == '.' ) 10 { 阅读全文
posted @ 2020-05-03 22:49 梦醒潇湘 阅读(142) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 class Solution { 2 public: 3 bool isLongPressedName(string name, string typed) 4 { 5 int indexN = 0; 6 int indexT = 0; 7 8 // 或的原因是防止typed后面 阅读全文
posted @ 2020-05-03 22:45 梦醒潇湘 阅读(170) 评论(0) 推荐(0)
摘要: 题目: 解答: 用双指针进行判断,当两边都是字母的时候就交换位置,否则,指向不是字母的指针移动,是字母的指针则保持不动,等待交换位置。 1 class Solution { 2 public: 3 string reverseOnlyLetters(string S) 4 { 5 int begin 阅读全文
posted @ 2020-05-03 22:37 梦醒潇湘 阅读(146) 评论(0) 推荐(0)
摘要: 题目: 解答: 只有两种情况下会返回True 1、有两个不一样的字母,交换位置后两个字母相等 2、所有字母都一样,则必须存在重复的字母 1 class Solution { 2 public: 3 bool buddyStrings(string A, string B) 4 { 5 if(A.le 阅读全文
posted @ 2020-05-03 21:31 梦醒潇湘 阅读(175) 评论(0) 推荐(0)
摘要: 题目: 解答: 先用transform函数将字符串转为小写,再遍历字符串搜索单词,建立map 对应的key-value关系,key是单词,value是单词出现次数。 再遍历banned数组,对这些ban的单词出现次数设为INT_MIN,再创建一个迭代器遍历map,找到最大value对应的单词即可。 阅读全文
posted @ 2020-05-03 21:25 梦醒潇湘 阅读(168) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一:暴力解法【通过】 思路: 遍历从 1 到 N 的每个数字 X,判断 X 是否为好数。 如果 X 中存在 3、4、7 这样的无效数字,则 X 不是一个好数。 如果 X 中不存在 2、5、6、9 这样的旋转后会变成不同的数字,则 X 不是一个好数。 否则,X 可以旋转成一个不同的 阅读全文
posted @ 2020-05-03 21:21 梦醒潇湘 阅读(374) 评论(0) 推荐(0)
摘要: 题目: 解答: 利用ASCII值大小写之间相差32的性质,遇到大写的字母,加上32就是相应的小写字母。 1 class Solution { 2 public: 3 string toLowerCase(string str) 4 { 5 if (str.size() <= 0) 6 { 7 ret 阅读全文
posted @ 2020-05-03 21:16 梦醒潇湘 阅读(201) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一: 本题的思路和前面的 647. 回文子串的思路相同, 找到每一个满足当前字符和前一个字符组合起来为 '01' 或者 '10' 的字符位置, 然后向前后进行扩展. 本题条件中也需要统计重复出现的字符串个数, 即位置不同的也需要统计, 所以跟前面的题目意思相同 1 class S 阅读全文
posted @ 2020-05-03 21:12 梦醒潇湘 阅读(228) 评论(0) 推荐(0)
摘要: 题目: 解答: 重复累加,当B.size()+temp.size()<n*A.size()时仍不是子串时,就可以判断false了! 原理是因为继续累加temp得到的知识重复的结果,没有意义。 1 class Solution { 2 public: 3 int repeatedStringMatch 阅读全文
posted @ 2020-05-03 21:02 梦醒潇湘 阅读(208) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一:暴力法 算法: 对于给定字符串中的每个索 i,让我们删除该字符,然后检查结果字符串是否是回文。如果是(或者原始字符串是回文),那么我们将返回 true。 方法二:双指针 最重要一点:只能去掉一个字符1、左指针从第0位开始,右指针从最后一位开始2、定义一个bool容器,用于限定 阅读全文
posted @ 2020-05-03 20:58 梦醒潇湘 阅读(201) 评论(0) 推荐(0)
摘要: 题目: 解法: 我们可以模拟每个指令后机器人所在的位置。 算法: 一开始,机器人在 (x, y) = (0, 0)。如果指令是 'U',机器人会走到 (x, y-1),如果指令是 'R',机器人会走到 (x, y) = (x+1, y),以此类推。 1 class Solution { 2 publ 阅读全文
posted @ 2020-05-03 20:52 梦醒潇湘 阅读(161) 评论(0) 推荐(0)
摘要: 题目: 解法: 方法一:先反转整个字符串,然后在反转每个单词。 方法二:迭代器。 1 class Solution { 2 public: 3 4 string reverseWords(string s) 5 { 6 string::iterator it=s.begin(), bg=it; 7 阅读全文
posted @ 2020-05-03 20:47 梦醒潇湘 阅读(177) 评论(0) 推荐(0)
摘要: 题目: 解答: 此题题目说的很绕,就是 2k 一组,翻转 k 个,如果不够 k ,全部翻转该组。即条件判断是否满 k 个即可。 1 class Solution { 2 public: 3 string reverseStr(string s, int k) 4 { 5 bool flag = fa 阅读全文
posted @ 2020-05-03 20:36 梦醒潇湘 阅读(139) 评论(0) 推荐(0)
摘要: 题目: 解答: 简单来说就是a,b不相等的话就返回a,b最长的长度,否则就-1。 1 class Solution { 2 public: 3 int findLUSlength(string a, string b) 4 { 5 if(a == b) 6 { 7 return -1; 8 } 9 阅读全文
posted @ 2020-05-03 20:09 梦醒潇湘 阅读(164) 评论(0) 推荐(0)
摘要: 题目: 解答: 其实只要记录有多少个大写字母即可,在遍历过程中,如果大写字母的个数小于正在遍历的下标,说明不符合题解,既不是连续的出现大写字母,如 “AaAa” 遍历到第二个 A 时的情况。 最终判断是否为全大写或只是首字母大写即可。 1 class Solution { 2 public: 3 b 阅读全文
posted @ 2020-05-03 20:05 梦醒潇湘 阅读(204) 评论(0) 推荐(0)
摘要: 题目: 解答: 这题有参考别人的想法,换做我确实很难想到,但还是用我自己的话总结下思路吧。 思路大致如下:如果一个非空字符串s可以由它的一个子串重复多次构成,可以理解为s中存在m个子串,那么当两个字符串结合起来变成ss时,字符串s在新字符串ss的第二次位置不等于s的长度(相当于前一个字符串s中有n个 阅读全文
posted @ 2020-05-03 20:02 梦醒潇湘 阅读(271) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 class Solution { 2 public: 3 int compress(vector<char>& chars) 4 { 5 6 if (chars.empty()) 7 { 8 return 0; 9 } 10 11 size_t j = 0; 12 int cnt 阅读全文
posted @ 2020-05-03 19:56 梦醒潇湘 阅读(146) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 class Solution { 2 public: 3 int countSegments(string s) 4 { 5 int res = 0; 6 int flag=1; 7 if (s.size() == 0) 8 { 9 return res; 10 } 11 12 阅读全文
posted @ 2020-05-03 19:50 梦醒潇湘 阅读(179) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 class Solution { 2 public: 3 string addStrings(string num1, string num2) 4 { 5 int la = num1.size(); 6 int lb = num2.size(); 7 8 string sum 阅读全文
posted @ 2020-05-03 19:47 梦醒潇湘 阅读(164) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一: 线性时间复杂度解法这道题最优的解法就是线性复杂度了,为了保证每个元素是唯一的,至少得把每个字符都遍历一遍。 算法的思路就是遍历一遍字符串,然后把字符串中每个字符出现的次数保存在一个散列表中。这个过程的时间复杂度为 O(N)O(N),其中 NN 为字符串的长度。 接下来需要再 阅读全文
posted @ 2020-05-03 19:39 梦醒潇湘 阅读(182) 评论(0) 推荐(0)
摘要: 题目: 解答: 思路:此题最难的就是读懂题,此题的意思是用后面字符串的字符是否可以组成前面一个字符,所以此题只需要判断后面各个字符的总数是否大于前面字符的即可,这又成了一个映射问题,字符映射个数,所以我们又可以用map来解决问题,只需要先遍历后面字符串统计所有字符出现的次数,然后在遍历前面一个字符串 阅读全文
posted @ 2020-05-03 19:34 梦醒潇湘 阅读(149) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 class Solution { 2 private: 3 bool isOrigin(char c) 4 { 5 if(c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' || 6 c == 'A' || c == 阅读全文
posted @ 2020-05-03 19:31 梦醒潇湘 阅读(194) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 class Solution { 2 public: 3 void reverseString(vector<char>& s) 4 { 5 if (s.size() <= 1) 6 { 7 return; 8 } 9 10 int beg = 0; 11 int end = s 阅读全文
posted @ 2020-05-03 19:21 梦醒潇湘 阅读(208) 评论(0) 推荐(0)
摘要: 题目: 解法: 设置两个指针,一前以后进行扫描判断。 1 class Solution { 2 public: 3 4 //判断是否为合法,即是否为数字和字母 5 bool isAlphanumeric(char &c) 6 { 7 if(c >= 'A' && c <= 'Z') 8 { 9 c 阅读全文
posted @ 2020-05-03 19:18 梦醒潇湘 阅读(147) 评论(0) 推荐(0)
摘要: 题目: 解答: 学习下这种思路,尤其是对最后一次进位的处理。 1 class Solution { 2 public: 3 string addBinary(string a, string b) 4 { 5 int la = a.size(); 6 int lb = b.size(); 7 8 s 阅读全文
posted @ 2020-05-03 19:03 梦醒潇湘 阅读(213) 评论(0) 推荐(0)
摘要: 题目: 解答: (1)从前向后扫描,找到我们所关注的最后一个word,然后计算其长度。 1 class Solution { 2 public: 3 int lengthOfLastWord(string s) 4 { 5 int ctr = 0; 6 int last_ctr = 0; 7 8 f 阅读全文
posted @ 2020-05-03 17:43 梦醒潇湘 阅读(145) 评论(0) 推荐(0)
摘要: 题目: 解答: 递归+记忆。 class Solution { public: unordered_map<int,string> map; string countAndSay(int n) { string res; if(map.count(n)) { return map[n]; } els 阅读全文
posted @ 2020-05-03 17:39 梦醒潇湘 阅读(157) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 class Solution { 2 public: 3 int strStr(string haystack, string needle) 4 { 5 if(needle == "") 6 { 7 return 0; 8 } 9 if(haystack == "") 10 { 阅读全文
posted @ 2020-05-03 17:36 梦醒潇湘 阅读(133) 评论(0) 推荐(0)
摘要: 题目: 解答: 如果是括号的左半边,直接入栈即可; 如果是括号的右半边,需要与栈最上面的括号匹配,匹配失败直接返回false; for循环遍历结束后,判断栈是否为空,为空则表示所有的括号都已经匹配成功了。 1 class Solution { 2 public: 3 bool isValid(str 阅读全文
posted @ 2020-05-03 17:22 梦醒潇湘 阅读(171) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一: 首先找出最短字符串,然后一个一个匹配。 具体代码如下: 1 class Solution 2 { 3 public: 4 string longestCommonPrefix(vector<string> &strs) 5 { 6 if(strs.size() == 0) 阅读全文
posted @ 2020-05-03 17:19 梦醒潇湘 阅读(292) 评论(0) 推荐(0)
摘要: 题目: 解答: 代码行数:解析(1)构建一个字典记录所有罗马数字子串,注意长度为2的子串记录的值是(实际值 - 子串内左边罗马数字代表的数值); (2)这样一来,遍历整个 s的时候判断当前位置和前一个位置的两个字符组成的字符串是否在字典内,如果在就记录值,不在就说明当前位置不存在小数字在前面的情况, 阅读全文
posted @ 2020-05-03 17:15 梦醒潇湘 阅读(265) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一:暴力破解法 方法二:O(n^2)的算法 如果我们换一种思路,我们从里向外来判断。也就是我们先判断子字符串A是不是对称的。如果A不是对称的,那么向该子字符串两端各延长一个字符得到的字符串肯定不是对称的。如果A对称,那么我们只需要判断A两端延长的一个字符是不是相等的,如果相等,则 阅读全文
posted @ 2020-05-03 17:09 梦醒潇湘 阅读(218) 评论(0) 推荐(0)
摘要: 题目: 解答: 怎么确认一个字符是否已经存在于子串中呢?策略是用一个表存储已经出现过的字符。 请向面试官沟通交流:给定的字符串除了'a' - 'z'外,是否还有其他字符,比如Digits、Upper case letter。是否只是包含ASCII码?或者Unicode字符集合? 实现一: 1 cla 阅读全文
posted @ 2020-05-03 16:50 梦醒潇湘 阅读(173) 评论(0) 推荐(0)
摘要: 题目: 解法: 本题与主站 226 题相同:https://leetcode-cn.com/problems/invert-binary-tree/ 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int 阅读全文
posted @ 2020-05-03 16:15 梦醒潇湘 阅读(136) 评论(0) 推荐(0)
摘要: 题目: 解答: 题思路: 先定义一个节点ans用来返回整棵树,定义另一个节点cur=ans,用来表示正在遍历的节点的上一个节点。 进行中序遍历,每遍历到一个节点时,就将它的左孩子设为NULL,然后将它身作为上一个节点的右孩子。 1 /** 2 * Definition for a binary tr 阅读全文
posted @ 2020-05-03 16:12 梦醒潇湘 阅读(223) 评论(0) 推荐(0)
摘要: 题目: 解答: 同题目"【树】高度平衡二叉树的判定"。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 阅读全文
posted @ 2020-05-03 16:09 梦醒潇湘 阅读(161) 评论(0) 推荐(0)
摘要: 题目: 解答: 首先复习下二叉搜索树的定义:对于树中的所有子树都有,左子树上的值都小于根节点的值,右子树上的值都大于根节点上的值。 总结一下就是,树的中序遍历可以得到一个升序序列。 那如何保证高度最小呢?当树中的任意结点的左右子树高度差都不超过 1 时,整棵树的深度最小。 下面是一种构造最小高度树的 阅读全文
posted @ 2020-05-03 16:05 梦醒潇湘 阅读(202) 评论(0) 推荐(0)
摘要: 题目: 解答: 从根节点开始遍历,每向下一个节点,我们可以把父节点传入的值左移一位并或上当前节点的值。 int newval = val << 1 | node->val; 这样我们就得到了一个从根节点到当前节点表示的数值。接下来我们要做的只是判断一个节点是不是叶子节点,如果是的话就累加,否则继续。 阅读全文
posted @ 2020-05-03 16:02 梦醒潇湘 阅读(192) 评论(0) 推荐(0)
摘要: 题目: 解答: 很简单题目,核心就是层序遍历。 如果一个节点的左右左孩子出现空的情况,则用INT_MIN来代替左右孩子节点值,并将左右孩子节点压入队列,这么做的目的只是为了方便我们判断。【类似满二叉树一样对待】 如果在某一深度的搜索结果: (1)x, y都没有找到,则进行下一深度的查找(2)x, y 阅读全文
posted @ 2020-05-03 15:53 梦醒潇湘 阅读(366) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一:深度优先搜索 思路与算法: 我们先进行一次深度优先搜索,获取这颗树中的所有节点的值。然后,就可以判断所有节点的值是不是都相等了。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * in 阅读全文
posted @ 2020-05-03 15:47 梦醒潇湘 阅读(162) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : 阅读全文
posted @ 2020-05-03 15:39 梦醒潇湘 阅读(162) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : 阅读全文
posted @ 2020-05-03 15:32 梦醒潇湘 阅读(143) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一:中序遍历 + 构造新的树 我们在树上进行中序遍历,就可以从小到大得到树上的节点。我们把这些节点的对应的值存放在数组中,它们已经有序。接着我们直接根据数组构件题目要求的树即可。 1 /** 2 * Definition for a binary tree node. 3 * s 阅读全文
posted @ 2020-05-03 15:28 梦醒潇湘 阅读(186) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int 阅读全文
posted @ 2020-05-03 15:22 梦醒潇湘 阅读(179) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法:深度优先搜索 思路和算法: 首先,让我们找出给定的两个树的叶值序列。之后,我们可以比较它们,看看它们是否相等。 要找出树的叶值序列,我们可以使用深度优先搜索。如果结点是叶子,那么 dfs 函数会写入结点的值,然后递归地探索每个子结点。这可以保证按从左到右的顺序访问每片叶子,因为 阅读全文
posted @ 2020-05-03 15:17 梦醒潇湘 阅读(168) 评论(0) 推荐(0)
摘要: 题目: 解答: 同题目530。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode( 阅读全文
posted @ 2020-05-03 15:14 梦醒潇湘 阅读(161) 评论(0) 推荐(0)
摘要: 题目: 解答: 概述: 二叉搜索树的巨大优势是:在平均情况下,能够在log(N)的时间内完成搜索和插入元素。 二叉搜索树的插入方法非常简单,我们将插入的节点作为叶子节点的子节点插入。插入到哪个节点可以遵循以下原则: (1)若 val > node->val, 插入到右子树; (2)若val < no 阅读全文
posted @ 2020-05-03 15:11 梦醒潇湘 阅读(483) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一:递归 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(i 阅读全文
posted @ 2020-05-03 15:04 梦醒潇湘 阅读(130) 评论(0) 推荐(0)
摘要: 题目: 解答: 首先递归遍历树,记录下根节点的数据,然后对数据进行排序,从数据头开始遍历,找出第二小的数据。时间复杂度:o(n)+o(logn/2)空间复杂度:o(n) 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode 阅读全文
posted @ 2020-05-03 14:54 梦醒潇湘 阅读(181) 评论(0) 推荐(0)
摘要: 题目: 解答: 思路: 令 trim(node) 作为该节点上的子树的理想答案。我们可以递归地构建该答案。 算法: 当node.val > R,那么修剪后的二叉树必定出现在节点的左边。 类似地,当node.val < L,那么修剪后的二叉树出现在节点的右边。否则,我们将会修剪树的两边。 1 /** 阅读全文
posted @ 2020-05-03 14:50 梦醒潇湘 阅读(174) 评论(0) 推荐(0)
摘要: 题目: 解法: 方法一: 层次遍历+序号法 思路:对节点编号,根节点编号为i,从0开始,那么左子树为2i+1,右子树2i+2。 那么,每层的宽度 = 最后一个节点编号 – 第一个节点编号+1,编号不受空节点的影响。 1 /** 2 * Definition for a binary tree nod 阅读全文
posted @ 2020-05-03 14:46 梦醒潇湘 阅读(251) 评论(0) 推荐(0)
摘要: 题目: 解法: 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : 阅读全文
posted @ 2020-05-03 14:38 梦醒潇湘 阅读(139) 评论(0) 推荐(0)
摘要: 题目: 解答: 先中序遍历,将元素存入数组,再使用两数之和II的双指针方法找两个数。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * Tre 阅读全文
posted @ 2020-05-03 14:33 梦醒潇湘 阅读(165) 评论(0) 推荐(0)
摘要: 题目: 解答: 使用深度优先搜索,其中递归函数返回当前子树的序列化结果。把每个节点开始的子树序列化结果保存在 mapmap 中,然后判断是否存在重复的子树。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * 阅读全文
posted @ 2020-05-03 14:30 梦醒潇湘 阅读(191) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一:递归 我们可以对这两棵树同时进行前序遍历,并将对应的节点进行合并。在遍历时,如果两棵树的当前节点均不为空,我们就将它们的值进行相加,并对它们的左孩子和右孩子进行递归合并;如果其中有一棵树为空,那么我们返回另一颗树作为结果;如果两棵树均为空,此时返回任意一棵树均可(因为都是空) 阅读全文
posted @ 2020-05-03 14:19 梦醒潇湘 阅读(242) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一:递归 我们可以使用递归的方法得到二叉树的前序遍历。在递归时,根据题目描述,我们需要加上额外的括号,会有以下4中情况。 如果当前节点有两个孩子,那我们递归时,需要在两个孩子的结果外加上一层括号; 如果当前节点没有孩子,那我们不需要在节点后面加上任何括号; 如果当前节点只有左孩子 阅读全文
posted @ 2020-05-03 14:15 梦醒潇湘 阅读(210) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一:递归 1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 vector<Node*> children; 7 8 Node() {} 9 10 Node(int _val) { 11 v 阅读全文
posted @ 2020-05-03 14:02 梦醒潇湘 阅读(192) 评论(0) 推荐(0)
摘要: 题目: 解法: 方法一:递归 1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 vector<Node*> children; 7 8 Node() {} 9 10 Node(int _val) { 11 v 阅读全文
posted @ 2020-05-03 13:55 梦醒潇湘 阅读(243) 评论(0) 推荐(0)
摘要: 题目: 解法: 方法:递归 算法: 从问题的描述中,可以清楚地了解到,我们需要在给定树的每个结点处找到其坡度,并将所有的坡度相加以获得最终结果。要找出任意结点的坡度,我们需要求出该结点的左子树上所有结点和以及其右子树上全部结点和的差值。 因此,为了找出解决方案,我们使用递归函数 traverse,在 阅读全文
posted @ 2020-05-03 13:39 梦醒潇湘 阅读(157) 评论(0) 推荐(0)
摘要: 题目: 解答: 1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 vector<Node*> children; 7 8 Node() {} 9 10 Node(int _val) { 11 val = _v 阅读全文
posted @ 2020-05-03 13:35 梦醒潇湘 阅读(181) 评论(0) 推荐(0)
摘要: 题目: 解法: 方法:深度优先搜索 首先我们知道一条路径的长度为该路径经过的节点数减一,所以求直径(即求路径长度的最大值)等效于求路径经过节点数的最大值减一。 而任意一条路径均可以被看作由某个节点为起点,从其左儿子和右儿子向下遍历的路径拼接得到。 如图我们可以知道路径 [9, 4, 2, 5, 7, 阅读全文
posted @ 2020-05-03 13:32 梦醒潇湘 阅读(176) 评论(0) 推荐(0)
摘要: 题目: 解答: 方法一:回溯 想法: 一个反序中序遍历的方法是通过递归实现。通过调用栈回到之前的节点,我们可以轻松地反序遍历所有节点。 算法: 在递归方法中,我们维护一些递归调用过程中可以访问和修改的全局变量。首先我们判断当前访问的节点是否存在,如果存在就递归右子树,递归回来的时候更新总和和当前点的 阅读全文
posted @ 2020-05-03 13:25 梦醒潇湘 阅读(146) 评论(0) 推荐(0)
摘要: 题目: 解法: 中序遍历得到一个升序序列,将遍历的结果存在一个数组val中,然后用另一个数组diff存数组val中前后元素的差值,输出其中的最小值。 代码略微繁琐,欢迎提出优化建议。 1 /** 2 * Definition for a binary tree node. 3 * struct Tr 阅读全文
posted @ 2020-05-03 13:15 梦醒潇湘 阅读(156) 评论(0) 推荐(0)
摘要: 题目: 解法: 层次遍历就好,然后找出每层的最大的值,进行保存。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *rig 阅读全文
posted @ 2020-05-03 13:06 梦醒潇湘 阅读(151) 评论(0) 推荐(0)
摘要: 题目: 解法: 解题思路中序遍历,使用一个全局遍量记录最大深度,当到达的深度大于目前的最大深度时,为第一次到达该最大深度,更新结果,不超过该深度时,均不会更新。 复杂度时间复杂度:每个结点访问一次,O(n)O(n)空间复杂度:不计算调栈,O(1)O(1);计算调栈O(h)O(h),h为最大深度 1 阅读全文
posted @ 2020-05-03 12:59 梦醒潇湘 阅读(150) 评论(0) 推荐(0)
摘要: 题目: 解决: dfs遍历整个树 然后通过一个map记录对应的值,当遍历完成之后 遍历一遍max即可。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left 阅读全文
posted @ 2020-05-03 12:55 梦醒潇湘 阅读(165) 评论(0) 推荐(0)
摘要: 题目: 解决: 通过大佬题解 了解二叉搜索树的一个重要特性是中序遍历递增,那么根据这个特性可以很容易的得到一个递增的数组,然后对该数组进行判断即可得出结果。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * 阅读全文
posted @ 2020-05-03 12:39 梦醒潇湘 阅读(181) 评论(0) 推荐(0)
摘要: 题目: 解法: 二叉搜索树的三个特性: 这些性质最好在面试之前了解清楚: 二叉搜索树的中序遍历的序列是递增排序的序列。中序遍历的遍历次序:left->Node->right。 Successor代表的是中序遍历序列的下一个节点。即比当前节点大的最小节点,简称后继节点。先取当前节点的右节点,然后一直取 阅读全文
posted @ 2020-05-03 12:34 梦醒潇湘 阅读(174) 评论(0) 推荐(0)
摘要: 题目: 解法: 第一种做法:最容易想到的方法,双递归,先序遍历的变式,把每个遍历到的节点当作root(起点)进行搜索。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNo 阅读全文
posted @ 2020-05-03 12:19 梦醒潇湘 阅读(161) 评论(0) 推荐(0)
摘要: 题目: 解法: 广度优先遍历就好。 1 /* 2 // Definition for a Node. 3 class Node { 4 public: 5 int val; 6 vector<Node*> children; 7 8 Node() {} 9 10 Node(int _val) { 1 阅读全文
posted @ 2020-05-03 12:01 梦醒潇湘 阅读(156) 评论(0) 推荐(0)
摘要: 题目: 解法: 难点主要是在判断是否是左叶子。 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * T 阅读全文
posted @ 2020-05-03 11:44 梦醒潇湘 阅读(96) 评论(0) 推荐(0)