随笔分类 - 数据结构与算法
摘要:Floyd Cycle Detection Algorithm Floyd Cycle Detection Algorithm,即 Floyd 循环检测算法,又称快慢指针法、龟兔指针法。该算法用于判断链表是否存在环,以及判断环的起点与长度的算法。 算法原理 该算法基于两个指针,从头开始遍历,一个指针
阅读全文
摘要:差分 考虑一个问题,给出 n 个数据,每次给出一个请求(x, y, k),每次将 x 到 y 位置的数据加上 k,要求在 O(n) 的时间内解决。 暴力解法 —— O(n2),明显不行。 线段树或树状数组 —— O(qlogn),q 为请求次数。 差分 —— O(n),不辱使命。 实现方法 开一个于
阅读全文
摘要:单调队列 单调队列,即队列中元素之间的关系具有单调性,单调递减或单调递增,队首只出队,队尾可入队、出队。 实现方法 1.使用双端队列 Deque 实现 2.使用一个数组和 front、rear 两个指针来实现 front 指针指向队首元素,rear 指针指向队尾元素,即可实现队首出队与队尾入队、出队
阅读全文
摘要:前缀和 设 Si = A1 + A2 + ··· + Ai,其中 Si 就是叫做位置 i 的前缀和。 int[] a = new int[n]; int[] x = new int[n]; for (int i = 0; i < n; ++i) { a[i] = nextInt(); x[i] =
阅读全文
摘要:最大子段和 最大子段和一定是每个(准)程序员都接触过的问题,题目很简洁:给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。为什么每个(准)程序员都需要掌握呢?首先这问题解法很多,时间复杂度从 O(n3) -> O(n2) -> O(nlog2n) -> O(n)。通过解决这个问
阅读全文
摘要:二分查找 二分查找(Binary Search)又称折半查找,是一种高效率的查找方法。但是,折半查找要求线性表必须采用顺序存储结...
阅读全文
摘要:算法简介 PageRank(网页排名),用于衡量网页的重要程度的Google专有算法。最早的搜索引擎采用的是分类目录的方法,即通...
阅读全文
摘要:问题描述: 小艾是产自中国的一个移位寄存器,他最近很苦恼,他和他的同事吵架了,他们无法合作导致无法完成乘法操作,因为他自己只会通过移位完成乘2的乘法和除以2的除法,所以他无法完成复杂乘法。小艾的女朋友又比较笨,死活学不会乘法,小艾的女朋友不愿看他继续消沉下去,决定和小艾来一次说走就走的旅行,他们选择
阅读全文
摘要:问题描述: 如何在O(1)时间复杂度获取栈中的最大值和最小值? 问题分析: 普通栈规定的push(入栈)、pop(出栈)、peek(查看栈顶)等操作都只能在栈顶上操作,如果栈中元素是有序的,那么我们就可以记录栈顶和栈底元素完成问题要求,但这是不可能的。普通栈不能解决问题,显然我们需要重新定义一种新的
阅读全文