01 2023 档案
代码随想录算法训练营第十三天 二叉树 | 二叉树深度优先遍历 | lc144 二叉树的前序遍历 | lc145 二叉树的后序遍历 | lc94 二叉树的中序遍历
摘要:二叉树种类 满二叉树 层数为n,节点数为 的二叉树 完全二叉树 除了底层都是满的,底层不一定满,但是从左到右连续 二叉搜索树 按一定顺序排列的二叉数,如某节点左侧节点全部小于该节点,右侧节点全部大于该节点,搜索时间复杂度为 平衡二叉搜索树 左子树与右子树高度差绝对值不大
代码随想录算法训练营第十二天 239. 滑动窗口最大值 | 347.前 K 个高频元素
摘要:队列应用 lc239 滑动窗口最大值 本题可以使用队列来记录窗口,但是想要记录最大值,则需要使用单调队列,而且我们只需要维护大值。 在添加元素时,先将比要添加元素小且在尾部的元素全部弹出,再添加元素。 class Solution { private: class MyQueue{ public:
代码随想录算法训练营第十一天 20.有效的括号 | 1047. 删除字符串中的所有相邻重复项 | 150. 逆波兰表达式求值
摘要:栈应用 lc20 有效的括号 本题考验的是对栈操作的理解,关键在于梳理逻辑,写出判断条件。在写代码之前想清楚可能存在的不匹配的情况(左括号多了,右括号不匹配最近的左括号,右括号多了) class Solution { public: bool isValid(string s) { stack<ch
代码随想录算法训练营第十天 栈与队列 | 232.用栈实现队列 | 225. 用队列实现栈
摘要:栈与队列 栈:先进后出 (叠起来的盘子 Stack) 队列:先进先出 (现实中排队 Queue) 三个版本的STL HP STL,其他STL的蓝本,开源 P.J.Plauger STL, 被Visual C++采用,不开源 SGI STL,被Linux中GCC所采用,开源 底层实现 栈与队列的底层容
代码随想录算法训练营第九天 字符串总结 | 双指针回顾
摘要:一刷中,暂时跳过KMP,今天状态也不太好,简单了解了一下,后面来补上。今天先整理一下字符串和双指针。 字符串 除去目前没有掌握的KMP,字符串类的题目除了各种反转类型外,还有需要扩充字符串大小的题目。目前做过的题目基本集中在第八天的内容里: [[day8#字符串 lc344 反转字符串]] [[da
代码随想录算法训练营第八天 344.反转字符串 | 541. 反转字符串II | 剑指Offer 05.替换空格 | 151.翻转字符串里的单词 | 剑指Offer58-II.左旋转字符串
摘要:字符串 lc344 反转字符串 这道题目其实比较简单,关键在于理解题意并想想哪些库函数可以用,哪些不可以。像这道题,reverse就不要用,swap就可以。 自己的 class Solution { public: void reverseString(vector<char>& s) { int
代码随想录算法训练营第七天 454.四数相加II | 383. 赎金信 | 15. 三数之和 | 18. 四数之和
摘要:哈希unordered_map lc454 四数相加II 本题是目前遇到时间复杂度最高的题目,核心思路主要分成两部分,第一部分是将四个数组两两分组,每组用两层for循环遍历,也是导致时间复杂度为 的关键。第二部分与[[day6#unordered_map lc1 两数之和|leetco
代码随想录算法训练营第六天 哈希法 | 242.有效的字母异位词 | 349. 两个数组的交集 | 202. 快乐数 | 1. 两数之和
摘要:哈希表 哈希表适用于快速判断元素是否存在于表中,针对于哈希碰撞,有拉链法和线性探测法 拉链法 碰撞的元素被储存在链表中,拉链法需要根据数据规模选择适当的表大小,既不造成表内大量空值浪费内存,又不会产生过多碰撞使链表过长 线性探测法 线性探测法需要哈希表大小一定大于数据规模,这样在碰撞时可以向下查找到
代码随想录算法训练营第四天 24. 两两交换链表中的节点 | 19.删除链表的倒数第N个节点 | 面试题 02.07. 链表相交 | 142.环形链表II
摘要:链表操作 lc24 两两交换链表中的节点 这道题在熟悉链表操作后并不困难,在做的时候要想清楚每一步的顺序,可以画图辅助。 感觉步骤的顺序也可以更改,最重要的是不要出现空指针或丢失接下来数据位置 使用虚拟头节点可以一直找到头节点的位置 初见 pre+cur /** * Definition for s
代码随想录算法训练营第三天 链表 | 203.移除链表元素 | 707.设计链表 | 206.反转链表
摘要:链表 链表是一种线性结构,不同于使用连续空间的储存结构(vector,数组,string等),链表在内存中的储存方式并不是连续分布的,分配散乱,分配机制取决于操作系统的内存管理。 C++中定义链表节点的方式 // 单链表 struct ListNode { int val; // 节点上存储的元素
代码随想录算法训练营第二天 977.有序数组的平方 | 209.长度最小的子数组 | 59.螺旋矩阵II
摘要:双指针 lc977 有序数组的平方 如果暴力求解,基本上是将数组每一个元素平方后再排序,主要时间将消耗在排序上,时间复杂度是 , 这种解法忽略了数组本来的顺序信息 通过观察不难发现平方后数组的最大值会存在两边,最小值在中间 使用双指针可以将时间复杂度降到 自己写的双指针
代码随想录算法训练营第一天 数组 | 704. 二分查找 | 27. 移除元素
摘要:数组 使用连续的内存空间,间隔为储存数据类型的大小,C++中多维数组的内存空间也是连续的。 二分查找 二分查找多用于有序数组,通过不断缩小查找范围来实现。 具体实现一般有 左闭右闭 和 左闭右开 两种 (其他实现有可能不符合直觉,提高代码阅读的难度) 一般时间复杂度是 两种写法的