随笔分类 - C++
【C++】Manacher算法
摘要:Manacher算法可以在O(n)的时间复杂度解决最长回文串问题。 字符串预处理 为了避免讨论奇偶性,首先对原始字符串进行预处理,也就是在每个字符间隙加上#,即将aab变为#a#a#b#。当指向#时,代表回文串长度为偶数,否则为奇数。 string t = "#"; for (char c : s)
【C++】KMP算法
摘要:KMP算法用于解决字符串匹配问题,时间复杂度为O(m + n)。设s为待匹配字符串,'p'为m为模版字符串。'm'为s的长度,n为p的长度) 运用前后缀性质减少重复比较 从上图可以看出,当b与f失配时,与朴素暴力解法中直接将p后移一位继续比较不同,KMP方法利用p中存在的最长公共前后缀aa省略了重复
【C++】大根堆与小根堆
摘要:STL实现 C++中,大根堆和小根堆可以使用优先队列实现。 #include <queue> priority_queue<int> pq1 // 大根堆 priority_queue<int, vector<int>, greater<int>> pq2 // 小根堆 该STL支持自定义比较函数,
【C++】排序算法
摘要:快速排序 快速排序算法是一种非线形时间比较类排序算法,它采用了分治的思想: 从数列中取出一个数(随机选择一个数。如果只取第一个数,若整个数组本身就是有序的,那时间复杂度会退化到O(n2))作为pivot。 将数组进行划分(partition),将比基准数大的元素都移至枢轴右边,将小于等于基准数
【C++】快速幂运算
摘要:迭代 可以将幂运算的幂改为二进制写法,很容易就能找到其中的规律。 class Solution { public: int m = 1000000007; // 取模防止结果超出范围 long myPow(long x, int n) { long res = 1; while (n > 0) {
【C++】二叉树4种遍历方式的递归和迭代实现
摘要:前序遍历:根左右 递归 class Solution { vector<int> res; public: vector<int> preorderTraversal(TreeNode* root) { if (!root) return {}; // 前序操作 res.push_back(root