主页

链表力扣题型总结

写在前面 其实链表的题大多数都可以用双指针(快慢指针)来做, 只不过不像数组中的双指针那样左右移动, 链表(单链表)的双指针方法都是向后移动的. 刷完链表专题, 可以总结一下链表中常用的套路: (当然, 刷题还是要到位) 不要怕浪费空间, 头(尾)结点的 dummy 最好用. 不要怕浪费指针, 多个指针的移动别搞混. 不要怕画图, 很多题画个链表模拟一下指针移动就能解出来了. 链表声明 这里是力扣通用的链表结构体声明. 需要注意不要冲突定义, 比如设计链表这道题如果在全局定义了ListNode类就会报重定义错误… struct ListNode { int val; ListNode *next; ...

阅读更多

Linux定时器系统调用与示例

写在前面 写一下定时器与休眠部分的系统调用, 这部分内容还是很重要的, 特别是在Webserver使用中, 需要用到定时器 定时器是进程规划自己在未来某一时刻接获通知的一种机制。 休眠则能使进程(或线程)暂停执行一段时间. 进程可以使用setitimer()或alarm()来设置定时器,以便于在经历指定的一段实际(或进程)时间后收到信号通知。定时器的用途之一是为系统调用的阻塞设定时间上限。 应用程序如需暂停执行一段特定间隔的实际时间,可以使用各种合适的休眠函数。 定时器

阅读更多

递归代码转换迭代法的一些思路(c++为例)

写在前面 最近看很多的面试题都有常见算法的迭代(非递归)写法这一类, 下面总结下这类问题的一些一般方法(我自己的心得体会, 如有不对欢迎大家批评指正). 在常见算法中, 涉及到二叉树等树型数据结构这样的基本上都有对应的递归写法, 但是由于递归调用的过程中会出现程序栈空间的开辟, 造成内存空间的浪费(尾递归不会), 并且每一次调用的栈帧都会保存很多并不会在之后调用中用到的参数,变量等, 这就进一步加大了内存的浪费, 所以递归算法虽然直观, 也应该去想一下对应的迭代方法, 这也算是程序优化的一种主要思路. 除了数据结构, 一些排序算法也用到了递归, 例如快速排序, 归并排序和堆排序, 这些排序算法用递归写直观不少, 但是掌握其迭代写法也很有必要. 下面给出我对于转换递归为迭代的一些...

阅读更多

差分数组c++实现与力扣题目总结

写在前面 总结一下经典的差分数组方法, (华为机试刚考了), 思路很简单, 但是没遇到的话想写出来还是有点难度的. 参考了 labuladong 的博客, 里面的代码是 Java 实现的, 这里用 C++重写一下. 小而美的算法技巧:差分数组. 思路 差分数组是一种支持频繁对数组的某一区间进行增减, 以及查询的数据结构. 基本思想就是: (高中学的数列) 设数列为 ${a_i},\ i\in[0,\ n]$, 那么做一新数列${b_j},\ j\in[0, n]$, 且满足 \[\begin{cases} b_0 = a_0\\ b_j = a_i - a_{i-1}, \ j\in[1,\ n] \end{cases}\] 这样的数列(数组) $b_j$ 其...

阅读更多

二叉树力扣经典题型与特殊解法

写在前面 一些基本关系 结点数和树高 \[hh\] 完全二叉树节点范围 节点定义 取自 LeetCode. struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode() : val(0), left(nullptr), right(nullptr) {} TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(...

阅读更多

拓扑排序的c++实现

写在前面 写一下有向无环图(DAG, Directed Acyclic Graph)上的拓扑排序, 废话不多说了, 介绍部分大家可以参考算法导论或者 oi-wiki. https://oi-wiki.org/graph/topo/; 我写的完整代码: Topological-Sort 我们可以拿大学选课的例子来描述这个过程,比如学习大学课程中有:单变量微积分,线性代数,离散数学概述,概率论与统计学概述,语言基础,算法导论,机器学习。当我们想要学习 算法导论 的时候,就必须先学会 离散数学概述 和 概率论与统计学概述,不然在课堂就会听的一脸懵逼。当然还有一个更加前的课程 单变量微积分。这些课程就相当于几个顶点 , 顶点之间的有向边 就相当于学习课程的顺序。...

阅读更多

Total views.
您是Zorch的第 个小伙伴
Hits