Day16 | 二叉树 翻转二叉树&&对称二叉树
代码随想录 | Day16 | 二叉树:翻转二叉树&&对称二叉树主要学习内容: 1.二叉树的递归遍历 2.判断二叉树的递归遍历的方式是前中后那个非常重要 226.翻转二叉树226. 翻转二叉树 - 力扣(LeetCode) 递归遍历思路: 先想好递归三部曲里面的本层逻辑要干点什么,根据这个去想终止条件,返回值和函数参数会容易很多 本层逻辑中需要干的就是交换左右孩子就可以完成二叉树的翻转任务,我们只需要知道当前结点即可,所以函数参数需要传入当前节点。我们需要交换左右孩子,所以当前结点不可以为空,故终止条件为当前节点为空。我们只需要交换左右孩子,所以也不需要返回值。至此递归三部曲结束 1.确定函数参数和返回值 当前节点t以及void 1void pre_tra(TreeNode *t) 2.确定终止条件 当前节点不为空 12if(t==nullptr) return; 3.本层处理逻辑 交换左右孩子 1swap(t->left,t->right); 完整代码: 123456789101112131415class...
代码随想录回溯算法章节小总结
回溯算法章节小总结1.树层去重1.可以对原数组排序的40. 组合总和 II - 力扣(LeetCode) 通过排序+相邻元素相同+used数组来进行去重 123456789101112131415161718192021void backtracking(vector<int>& candidates, int target, int sum, int startIndex, vector<bool>& used) { if (sum == target) { result.push_back(path); return; } for (int i = startIndex; i < candidates.size() && sum + candidates[i] <= target; i++) { // used[i - 1] == true,说明同一树枝candidates[i -...
Day15 | 二叉树 递归遍历&&迭代遍历&&层序遍历
代码随想录 | Day15 | 二叉树:递归遍历&&迭代遍历&&层序遍历主要学习内容: 1.二叉树递归遍历 2.二叉树迭代遍历 3.二叉树层序遍历 递归三要素: 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。 来自代码随想录 (programmercarl.com) 144.二叉树的前序遍历144. 二叉树的前序遍历 -...
Day14 | 栈和队列 滑动窗口最大值&&前K个高频元素
代码随想录 | Day14 | 栈和队列:滑动窗口最大值&&前K个高频元素主要学习内容: 1.使用单调队列解决滑动窗口 2.使用优先级队列 3.map的第二个元素的排序问题 239.滑动窗口最大值239. 滑动窗口最大值 - 力扣(LeetCode) 思路:使用单调队列维护一个单调递减的队列,具体看这个例子 举例子来说明: nums={2,1,4,2,3,2},k=3 假设你在坐飞机,你的面前是要飞越的山,数组就是它们的高度,你的视野范围即你能看到的山的数量是滑动窗口大小,题目要求是,你想要找到视野范围内最高的山并且记录下来 单调队列的模拟过程 首先是 2 1进入你的眼帘,我们把2 1入队 当4进入你的视野后,2和1就再也不可能是你视野中最高的山了 所以我们在 2 1 4中删去 2 1留下4,现在队中只剩下4,所以你在第一块视野内最高的山峰是4,记录下来 接着飞机飞到了2 2有可能成为你视野中的最大值,因为4可能会离开你的视野,即滑动窗口内已经不包含4了,所以入队 此时4仍然是视野内最高的山峰,记录下来 接着飞到了...
Day13 | 栈和队列 有效的括号&&删除字符串中的所有相邻重复项
代码随想录 | Day13 | 栈和队列:有效的括号&&删除字符串中的所有相邻重复项20.有效的括号20. 有效的括号 - 力扣(LeetCode) 思路: 分为2种情况 第一,遇到左括号类型,就入栈对应的右括号 第二,遇到右括号类型,看栈顶是否是对应的左括号,是的话就就弹出栈顶元素就行,不是的话就直接false,说明前面的左括号少了,而咱们多出来的这个右括号类型后面再也不可能被匹配掉 1234567891011121314151617181920212223class Solution {public: bool isValid(string s) { stack<char> st; for(auto c:s) { //遇到左括号 if(c=='(') st.push(')'); else if(c=='[') ...
Day12 | 复习哈希表&&字符串
代码随想录 | Day12 | 复习哈希表&&字符串具体做法,全都重写一遍,此篇记录仍不太会的题目 Day 07 202. 快乐数 - 力扣(LeetCode) 写成先判断是不是循环后判断是不是1了,导致如果只有一个数1的话会判断为循环。。 1. 两数之和 - 力扣(LeetCode) 又犯了第一次的错误,要先看符不符合条件在添加而不是一股脑的全添加,全添加会导致如果第二次加的和第一次的一样那么第二次的就不会加入其中 Day 08 454. 四数相加 II - 力扣(LeetCode) 忘记统计组合出现的次数,只顾着有没有出现过,从而少了组数 15. 三数之和 - 力扣(LeetCode) 最后忘记了收缩快慢指针 18. 四数之和 - 力扣(LeetCode) 第二个for给第二个元素去重时不应该直接返回res,而是应该break 151. 反转字符串中的单词 - 力扣(LeetCode) Day 09 去除空格的双指针过程有错误,这个很不熟练,要多加练习 难的还是。。。。。(失落)
侯捷 C++11 新特性 学习笔记
C++11 新特性 学习笔记1.Variadic TemplatesC++11支持函数模板的默认模板参数在 C++98/03 标准中,类模板可以有默认的模板参数,如下: 12345template <typename T, typename U = int, U N = 0>struct Foo{ // ...}; 但是却不支持函数的默认模板参数: 12345template <typename T = int> // error in C++98/03: default template argumentsvoid func(){ // ...} 现在这一限制在 C++11 中被解除了。上面的 func 函数在 C++11 中可以直接使用,代码如下: 12345int main(void){ func(); //T = int return 0;} 此时模板参数 T 的类型就为默认值...
Day11 | 复习数组&&链表
代码随想录 | Day11 | 复习数组&&链表具体做法,全都重写一遍,此篇记录仍不太会的题目 Day 01 34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode) 忘记了在相等情况下加标记这一做法,想着按照原来找左右边界的做法来做,其实更推荐的是加标记,既好记住又不容易错 Day 02 26. 删除有序数组中的重复项 - 力扣(LeetCode) 需要双指针要想双指针定义,如何初始化,快慢指针向前移动的条件! 904. 水果成篮 - 力扣(LeetCode) 没搞清楚滑动窗口后端后移的条件,其实就没啥条件,移动就完事了,如果种类超过了2种会由循环进行处理,不用理会 Day 04 54. 螺旋矩阵 - 力扣(LeetCode) 忘了最后的条件要写res.size()>n*m了 Day 06 24. 两两交换链表中的节点 -...
Day10 | 字符串 KMP算法&&找出字符串中第一个匹配项的下标&&重复的子字符串
代码随想录 | Day10 | 字符串:KMP算法&&找出字符串中第一个匹配项的下标&&重复的子字符串主要学习内容: 1.KMP算法 2.应用KMP算法解题 KMP算法关键点: 1.前后缀定义 前缀:包含首字母的所有子串 后缀:包含尾字母的所有子串 2.最长的相等的前后缀的定义 当前字母的最长的相等前后缀看的是不包含该字母的前面的字符串 1234举例:a a b a a ff的最长的相等的前后缀看的是a a b a a 即为2相等的最长前缀和后缀分别是 a a 和 a a 3.next数组 作用是记录当前的字符如果不匹配那么下一次开始匹配的位置 而最长的相等的前后缀的长度就是下一次开始匹配的位置 12345举例:模式串:a a b a a b a a f 匹配串:a a b a a f ...
Day09 | 字符串 反转字符串&&反转字符串II&&反转字符串里的单词
代码随想录 | Day09 | 字符串:反转字符串&&反转字符串II&&反转字符串里的单词主要学习内容: 1.双指针操作字符串 2.reverse函数的使用 344.反转字符串344. 反转字符串 - 力扣(LeetCode) 可以调用reverse反转字符串函数 解法:双指针123456789101112class Solution {public: void reverseString(vector<char>& s) { for(int i=0;i<s.size()/2;i++) swap(s[i],s[s.size()-i-1]); /* for (int i = 0, j = s.size() - 1; i < s.size()/2; i++, j--) { swap(s[i],s[j]); */ ...