随笔分类 - 数据结构与算法
摘要:poj 2387 dijkstra c++ include include using namespace std; / poj 2387 link: http://poj.org/problem?id=2387 / int main(){ int T, N; / 赋值INF要注意一定要够大 / c
阅读全文
摘要:异或实现加法 另一种思路也可以使用 "01来实现三进制" ,根据真值表写出逻辑表达式 c++ class Solution { public: int singleNumber(vector& nums) { int a = 0, b = 0; for(int i = 0; i
阅读全文
摘要:线段树模板题来源:https://www.lintcode.com/problem/segment tree build/description 201. 线段树的构造 202. 线段树的查询 203. 线段树的修改 247. 线段树查询 II 248. 统计比给定整数小的数的个数 c++ clas
阅读全文
摘要:基础 首先了解C++中存在于头文件\两个库函数:lower_bound和upper_bound lower_bound(start, end, val)返回在[start, end)中找到第一个大于等于val的 位置 upper_bound(start, end, val)返回在[start, en
阅读全文
摘要:最长公共子序列LCS "Lintcode 77. 最长公共子序列" LCS问题是求两个字符串的最长公共子序列 $$ dp[i][j] = \left\{\begin{matrix} & max(dp[i 1][j], dp[i][j 1]), s[i] != s[j]\\ & dp[i 1][j 1
阅读全文
摘要:题目 "leetcode:5. Longest Palindromic Substring" 解法 动态规划 时间复杂度$O(n^2)$,空间复杂度$O(n^2)$ 基本解法直接看代码 中心扩散法 时间复杂度$O(n^2)$,空间复杂度$O(1)$ 我们先假定以某点为中心向两端扩散,找到以该点为中心
阅读全文
摘要:互斥的硬件支持 中断禁用 单处理器机器中,并发进程不能重叠只能交替,因此保证互斥,主要保证进程不被中断就可以了 专用机器指令 + test_and_set compare_and_swap(obj, expected, desire)简称CAS,是一种乐观锁。 先检查obj所指的值是否和expect
阅读全文
摘要:同时找到最大值与最小值 找到n个元素中的最大/小值,比较次数为n 1, 找到n个元素中的最大值和最小值,可以Two Pass,比较次数为2n 2 也可以One Pass, 比较次数至多为 $\left \lfloor 3n/2 \right \rfloor$ 首先对最大值和最小值进行初始化,n为奇数
阅读全文
摘要:二叉搜索树的最近公共祖先 假如p, q在root同一侧,则继续递归这一侧,否则返回当前节点(可能当前节点为p,q之一,也可能在不同侧) 如果是BST,可以保存到p, q的路径,然后找到链表最后一个公共节点即可 "235. Lowest Common Ancestor of a Binary Sear
阅读全文
摘要:我们使用二叉树的先序遍历来遍历整个树,对于空子树保存为 ,恢复时也根据先序的顺序来恢复 "297. Serialize and Deserialize Binary Tree"
阅读全文
摘要:例题 + 中序遍历 "94. Binary Tree Inorder Traversal" + 先序遍历 "144. Binary Tree Preorder Traversal" + 后序遍历 "145. Binary Tree Postorder Traversal" 递归栈 递归函数栈的方法很
阅读全文
摘要:通常双指针用于解决滑动窗口问题(子数组),时间复杂度一般为O(n) 如果输入数组对顺序无要求,可以试着先对输入数组快排,尝试从双指针的角度切入 当然双指针问题不一定非得是两个指针,只是这么叫罢了 例题 Two Sum:给定一个数组,找到两个数其和为X 解: + 先对数组快排,然后一前一后两个指针求和
阅读全文
摘要:特点 假定文本串长度为n, 模式串长度为m, 朴素字符串比较时间复杂度为O(n m),KMP算法时间复杂度为O(n+m) 朴素算法在匹配失败后重新从首部开始匹配,而KMP则利用 模式串 本身的特点,在匹配失败时不用每次都从模式串首部开始匹配, 关键就在于利用模式串的前缀和后缀相同的部分 比如 , 当
阅读全文
摘要:0 1背包 件物品,背包最大容量为 , 第i件物品的费用为 ,价值为 使用 表示在容量为j,在前i件物品中(包括i)选择物品所获得的最大价值 递推方程为 在是否选择第i件物品取最大值 从后往前更新就可以使用一维数组简化 "416. Partition Equal Subset Sum" 完全背包 每
阅读全文
摘要:字符串处理 istringstream 根据空格分隔字符串 string转int int转string 示例如下 c++ include include include using namespace std; int main(){ string s = "a 5 "; istringstream
阅读全文
摘要:特点 常用于确定无向图的连通分量(虽然DFS也可以做),求最小公共祖先(LCA) 朴素版并查集 路径压缩 为了减少树的高度,直接将查找路径上的结点连接到根上去,降低查找时间 按秩合并 秩表示结点高度的上界,(算法导论上说路径压缩不会改变每个结点的秩?没想通,难道是指的上界),将秩小的树指向秩大的树称
阅读全文
摘要:特点 树状数组常用于查询前缀和,前缀和通过差分可以得到区间和,并支持单点修改 单点修改和查询前缀和的时间复杂度均为$O(n\log_2 n)$ 数据结构与基本操作 假定有$a_1, a_2, ..., a_n$共n个数,我们使用数组bit[n+1] = {0}, 其中0位置不存储任何信息,仅作为边界
阅读全文
摘要:Floyd判圈算法能在 O(n) 时间复杂度内判断 迭代函数 或 链表 中 是否有环 ,并求出 环的长度与起点 判断环存在 通常采用快慢指针的方式来判断环是否存在 从绿色起点G开始,快指针每次走2步,慢指针每次走1步,当链表未遍历完且快慢指针相遇且时说明链表中存在环 很容易证明:假定链表存在环,那么
阅读全文
摘要:渐进记号 $O$渐进上界,$\Theta$渐进紧确界,$\Omega$渐进下界,$o$非渐进紧确上界,$\omega$非渐进紧确下界 例如$2n^2 = O(n^2)$是渐进紧确的,但$2n = O(n^2)$不是渐进紧确的,我们使用$2n = o(n^2)$ 公式 $\lg(n!) = \Thet
阅读全文

浙公网安备 33010602011771号