随笔分类 - 算法思路与技巧
思维锻炼
摘要:1. 树结构 与 链表之间的转换关系: 437. 路径总和 III : 二叉树 与 链表之间的思维转换 + 链表解决题目的方法; 1 //二叉树相当于 两条走向的链表,这道题对于链表用前缀和解决; 2 //那么两条走向的链表 处理方法; 3 /** 4 * Definition for a bina
阅读全文
AC自动机(Aho-Corasick automaton)
摘要:**基础知识** 针对多模匹配问题的解决方案:字典树 + KMP 算法 ==> AC 自动机 1. 字典树的暴力匹配: 1 #include <iostream> 2 #include <string> 3 #include <cstring> 4 #include <vector> 5 #incl
阅读全文
字典树(Trie) 与双数组字典树(DoubleArrayTrie)
摘要:**基础知识** 字典树(Trie): 单词查找树, 可用于单词查找,字符串排序; 在大部分的树中, 节点 代表 集合;边 代表 关系;(很重要,代码实现中很多地方都体现); 字典树的具体结构如下图,其中每一条边代表一个字符;不同节点颜色代表以该节点结尾的单词是否存在(粉色:存在;白色:不存在)。
阅读全文
经典字符串匹配算法
摘要:**基础知识** 前置知识: 母串S/文本串:被查找源字符串; 模式串T: 目标字符串; 单模匹配问题:只有一个模式串问题; 字符串匹配算法需要极强观察能力; 常见的算法: 1. 暴力匹配(brute force):保证不重不漏的进行每一次匹配,实现查找的目的;O(n * m); 2. KMP算法
阅读全文
递推与动态规划
摘要:**基础知识** 1.递推基础知识: 斐波那契(Fibonacii)数列的递推公式:F(n) = F(n -1) + F(n - 2); 70. 爬楼梯: Fibonacci 的最直接体现; 前置知识: 数学归纳法: a: 验证k0 成立; (边界条件) b: 证明如果ki 成立,那么Ki+1 也成
阅读全文
红黑树(RB Tree)
摘要:**基础知识** 红黑树的基本性质:(红黑树是弱化版的AVL 树) 1. 每个节点非黑即红; 2. 根节点是黑色; 3. 叶节点(NIL(Null-pointer to objective))是黑色的; 在示意图中没有画出来的NIL!! 在删除操作中很重要,删除操作中主要就是处理双重黑失衡; 4.
阅读全文
单调队列(monotone-Queue)/单调栈(monotone-Stack)
摘要:**基础知识** 单调队列(monotone-Queue):重点关注队首元素 目的: 主要为了解决RMQ(range Minimum/Maximum Query) 区间最值问题; 如果不移除开头元素,则最终deque 中留下的元素,则是用来解决固定末尾RMQ问题; 本质来讲,由每次往后移位后对应的d
阅读全文
常见查找与搜索(二分/DFS/BFS/HashMap)
摘要:**基础知识** 1.二分算法:二分的是问题规模,减少无用范围; a. 二分查找: 对顺序查找的优化, 二分的是区间范围;最终找到的结果是在区间范围内,满足条件的位置(隐藏的含义是,最终找到的可能是最左边/右边的位置,这也是对于代码处理过程要注意的边界条件); 基本过程: min 是头指针; max
阅读全文
经典排序算法(快排/归并)
摘要:**基础知识** 排序算法重要性: 问题系统熵决定了一个问题被解决的难易程度,排序可以有效降低熵值; 排序中有很多算法中都有分治的思想; **代码演示** 1. 一些基本的排序方法及优化(选择,冒泡,插入排序, 堆排序); 注意边界条件,特别是递归中下一次递归的范围没有减少,就会陷入死循环中; 对于
阅读全文
常见的代码技巧
摘要:1. 双指针法(定长,变长); 滑动窗口:3. 无重复字符的最长子串 1 //滑动窗口 + 二分 2 3 class Solution { 4 public: 5 bool check(int len, string s) { 6 vector<int> cnt(256, 0); 7 int k =
阅读全文