
算法
文章平均质量分 94
数学家是我理想
博客:https://wmathor.com
展开
-
布隆过滤器
布隆过滤器概述布隆过滤器解决这样一个问题,假设有一个搜索引擎公司,在他公司的服务器上,有100亿条URL黑名单,当你搜索某个URL的时候,服务器就会检测这些URL在不在黑名单,如果在,就不显示,如果不在,就显示首先算一下这个100亿的URL占多大存储空间,假设一个URL是64字节,算下来总共大概640GB要求:该系统允许有万分之一以下的失误率使用的额外空间不能超过30GB哈希函数...原创 2019-09-30 09:14:36 · 585 阅读 · 1 评论 -
ST算法与LCA
RMQ问题RMQ(Range Minimum/Maximum Query),即区间最值查询。对于长度为n的数列arr,回答若干询问Q(i,j),返回数列arr中下标在i,j之间的最大/小值。如果只有一次询问,那一遍for就可以搞定,但是如果有多次询问就无法在很快的时间处理出来。ST算法ST算法是一个在线算法,它可以在O(nlogn)时间内进行预处理,然后在O(1)的时间内回答每个查询,假设现...原创 2018-11-02 13:07:24 · 320 阅读 · 1 评论 -
[kuangbin带你飞]专题一 简单搜索
A-棋盘问题水题,dfs枚举行和放了第几个就行了import java.util.Scanner;public class Main { static int n,k,ans; static int[][] map; static boolean[] vis; static void dfs(int row,int idx) {//row行,已经放了idx个 if(idx ==...原创 2018-11-02 13:07:02 · 356 阅读 · 0 评论 -
Dancing Links算法
Dancing Links略述Dancing Links算法主要用于解决精确覆盖问题,精确覆盖问题就的定义:给定一个由0-1组成的矩阵,是否能找到一个行的集合,使得每个集合中每一列恰好只包含一个1。例如下面的矩阵,我们将改矩阵命名为矩阵1如何利用给定的矩阵求出相应行的集合呢,采用回溯法。假定选择第一行,如下所示如上图所示,红色那一行是选中的行,这一行有3个1,分别是第3,5,6列。由于这...原创 2018-11-02 13:06:19 · 1164 阅读 · 0 评论 -
单调栈
用法给你一个数组,要求你找到数组中每个元素左边第一个比他大的数和右边第一个比它大的数,举个例子,数组[3,5,2,1,6],3左边比他大的没有,右边比他大的是5;5左边比它大的没有,右边比他大的是6;2左边比它大的是5,右边比他大的是6;1左边比他大的是2,右边比他大的是6;6左边比他大的没有,右边比它大的没有单调栈应用上面的问题,直接遍历可以,但是如果利用单调栈来做,可以保证时间复杂度为O...原创 2018-11-06 22:48:54 · 245 阅读 · 0 评论 -
保卫方案(京东笔试题)
Question战争游戏的至关重要环节就要到来了,这次的结果将决定王国的生死存亡,小B负责首都的防卫工作。首都位于一个四面环山的盆地中,周围的n个小山构成一个环,作为预警措施,小B计划在每个小山上设置一个观察哨,日夜不停的瞭望周围发生的情况。 一旦发生外地入侵事件,山顶上的岗哨将点燃烽烟,若两个岗哨所在的山峰之间没有更高的山峰遮挡且两者之间有相连通路,则岗哨可以观察到另一个山峰上的烽烟是否点燃。...原创 2018-11-06 22:47:34 · 591 阅读 · 0 评论 -
Morris遍历
Morris算法遍历一棵二叉树,时间复杂度O(n),但是空间复杂度却只用神奇的O(1),下面说一下Morris遍历的流程,首先规定来到的当前结点即为cur如果cur无左孩子(cur.left = null),cur向右移动(cur = cur.right)如果cur有左孩子(cur.left != null),找到cur左子树上最右的结点,记为mostRight如果mostRight无右...原创 2018-11-06 22:47:15 · 274 阅读 · 0 评论 -
图的常见算法
图的表示方式图是由一系列点和边的集合构成的,一般有邻接矩阵和邻接表两种表示方式,c/c++可以看我的这篇文章:搜索(1)这篇文章主要讲java语言中图的相关算法。首先看一下图结构的代码:class Node {//点集 public int value; public int in;//入度 public int out;//出度 public ArrayList<Node&g...原创 2018-11-06 22:46:53 · 1775 阅读 · 0 评论 -
Xor(滴滴笔试题)
题目描述给出一个数组,问最多有多少个不重叠的非空区间,使得每个区间内的数字的xor都等于0。示例输入 1 2 3 0 3 2 1 0输出 4思路DP,假设数组最后一个数的下标是i,并且数组存在一个最优划分,使得划分的子数组个数最多,那么i有两种情况,第一,i所在的划分区间异或为0;第二,i所在的划分区间,异或不为0。对于第一种情况dp[i] = dp[i-1]的,对于第二种情况,假设i...原创 2018-11-06 22:46:01 · 1127 阅读 · 0 评论 -
位与进制
位运算简介这里我假设读者有二进制的思维,知道(3)10=(011)2(3)_{10}=(011)_2(3)10=(011)2将十进制转换为二进制的方法&(与)、|(或)、^(异或)、~(非/取反)&gt>和<<运算符将二进制位进行右移或者左移操作&gt&gt&gt运算符将用0填充高位;>>运算符用符号位填充高位,没...原创 2018-11-03 21:22:32 · 1423 阅读 · 0 评论 -
堆及其相关应用
什么是堆?提到堆就不得不说到二叉树这个结构,堆就是一颗完全二叉树,什么叫完全二叉树,用一句话来概括就是:设二叉树的深度为h,除第h层外,其它各层的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树,举几个例子:堆分两种,一种叫大根堆,一种叫小根堆。大根堆就是在堆结构中,任意一棵子树的根节点一定是最大值,举个例子:看上图最左边的那颗树,他的子树有64323、643、...原创 2018-11-03 21:21:34 · 339 阅读 · 0 评论 -
比较器Comparator
Comparator接口java中有内置的排序,Arrays.sort(),现在我有一个Student类,类中三个成员变量name,id,age,我现在想以age作为参考进行升序排序,应该如何做,很简单,只需要自己定义一个类实现Comparator接口即可import java.util.*;class Student { String name; int id,age; Studen...原创 2018-11-03 21:21:13 · 245 阅读 · 0 评论 -
LeetCode3. 无重复字符的最长子串
题目链接:LeetCode3题解首先定义一个Map<Character,Integer>用来保存当前字符最后一次出现的下标位置。再定义一个pre数组,用来保存以每一个字符为结尾的最长无重复字符的子串。接下来可以这么想,假设遍历到了下标i,i位置对应的字符为c,第一种情况,如果c从来没有在Map中出现过,并且i不为0(也就是说c不为首字符),那么per[i] = pre[i - ...原创 2018-11-01 19:37:22 · 176 阅读 · 0 评论 -
小和问题
描述在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。例子[1,3,4,2,5]1左边比1小的数:没有3左边比3小的数:14左边比4小的数:1,32左边比2小的数:15左边比5小的数:1,3,4,2所以小和为1+1+3+1+1+3+4+2=16解题思路如果直接用两层for循环扫,时间复杂度是O(n2)O(n^2)O(n2),但是可以通过归...原创 2018-11-01 19:34:10 · 6345 阅读 · 2 评论 -
CodeForces E. XOR and Favorite Number(Div.2)
题目链接:E. XOR and Favorite Number题解一个莫队的基础题,题目要求[L,R]里面有多少对子区间异或值为k,记录一下前缀异或和arr,因为xx=0,现在我们要求区间[L,R]的异或和值,用arr数组表示就是arr[L-1]arr[R]=k,或者说arr[R]^k=arr[L-1]import java.io.BufferedInputStream;import j...原创 2018-11-02 13:07:48 · 229 阅读 · 0 评论 -
莫队算法
概述莫队算法是由莫涛提出的算法,可以解决一类离线区间询问问题,适用性极为广泛。同时将其加以扩展,便能轻松处理树上路径询问以及支持修改操作。例题Description:有n个数字,给出k,以及m个查询。每次查询的格式是L,R,求L~R(左闭右闭)这个区间内数字的出现次数刚好是k的数字种数。Example input:5 2 31 2 3 2 21 22 41 5Example ...原创 2018-11-02 13:08:10 · 314 阅读 · 0 评论 -
一致性哈希算法
工程设计中常用服务器集群来设计和实现数据缓存,以下是常见的策略:无论是添加、查询还是删除数据,都先将数据的id通过哈希函数转换成一个哈希值,记为key如果目前机器有N台,则计算key%N值,这个值就是该数据所属的的机器编号,无论是添加、删除还是查询操作,都只在这台机器上进行请分析这种缓存策略可能带来的问题,并提出改进的方案普通Hash算法缓存策略的潜在问题是如果增加或删除机器时(N变...原创 2019-09-30 09:14:05 · 413 阅读 · 0 评论 -
浅谈线段树(Segment Tree)
线段树的概念与性质线段树首先是一棵树,而且是二叉树。树上的每个节点对应于一个区间[a,b],a,b通常为整数。同一层的节点所代表的区间,互相不重叠。并且同一层的区间加起来是连续的区间,叶子节点的区间是单位长度1,无法再分例如下图表示的是区间[1,9]的线段树从图上可以看出线段树具有下面几个性质:每个区间的长度是区间内整数的个数叶子节点长度为1,不能再分若一个节点对应的区间是[a,b...原创 2019-09-28 11:00:16 · 425 阅读 · 0 评论 -
线段树例题
HDU 1754线段树板子题,结构体存保存的是左右端点以及这个区间内的最大值建树的过程其实是一个后序遍历的过程,先建立左子树然后右子树,根节点的最大值就是max(左孩子的最大值,右孩子的最大值)修改类似,更新当前节点的最大值为max(value, 当前节点的最大值)查询的时候用一个全局变量记录,每次查找到对应区间,就更新全局变量res = max(res, 当前区间的最大值)Java会...原创 2019-09-28 10:59:41 · 300 阅读 · 0 评论 -
并查集例题
关于并查集的介绍可以看我之前的文章并查集 Union FindPOJ 2236[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dsl7QFNn-1569639533744)(https://s2.ax1x.com/2019/01/11/FXljVH.png#shadow)]很水的并查集题目,结构体中除了存坐标x,y以外还要存是否被维修过合并的时候考虑的点比较多...原创 2019-09-28 10:59:17 · 479 阅读 · 0 评论 -
快速幂
首先看一道例题UVa 10006题目大意是说对于任意的1<x<n1 < x < n1<x<n都有xn≡x(modn)x^n\equiv x(mod n)xn≡x(modn)成立的合数nnn称为Carmichael Number,对于给定的整数nnn,判断它是不是Carmichael Number此题中,有n个待检查的数,如果每个数都按照定义O(n)O(n)...原创 2019-09-28 10:58:32 · 431 阅读 · 0 评论 -
Codeforces 541 F. Asya And Kittens(并查集+DFS)
题目大意是说,输入nnn,表示有nnn个数111~nnn,接下来有n−1n-1n−1对关系,每行输入两个数aaa和bbb,表示将aaa所在的集合与bbb所在的集合合并,但是合并有前提条件,aaa所在的集合与bbb所在的集合必须相邻(数组的第一个和最后一个不算相邻)。求这组序列最开始的排列情况,答案不唯一,输出一组答案即可做这道题前必须会:并查集、DFS并查集很容易想到,因为涉及到多个集合的相...原创 2019-09-28 10:57:41 · 234 阅读 · 0 评论 -
裴蜀等式与扩展欧几里得算法
裴蜀等式对于任何整数aaa、bbb和它们的最大公约数ddd,关于未知数xxx和yyy的线性丢番图方程称为裴蜀等式ax+by=max+by=max+by=m有整数解时当且仅当mmm是ddd的倍数裴蜀等式有解时必然有无穷多个整数解,每组解xxx、yyy都成为裴蜀数,xxx和yyy可用扩展欧几里得算法(Extended Euclidean algorithm)(Extended...原创 2019-09-28 10:56:32 · 377 阅读 · 0 评论 -
求解同余方程
前置知识a,ba,ba,b对mmm取模的结果相同,记为a≡b(mod m)a\equiv b(mod\ m)a≡b(mod m),即a mod m==b mod ma\ mod\ m == b\ mod\ ma mod m==b mod m如果a≡b(mod m)a\equiv b(m...原创 2019-09-28 10:55:48 · 8619 阅读 · 0 评论 -
乘法逆元
同余方程ax≡1(mod n)ax\equiv 1(mod\ n)ax≡1(mod n),gcd(a,n)=1gcd(a,n)=1gcd(a,n)=1时有整数解。这时称求出的xxx为aaa对模nnn的乘法逆元其实乘法逆元就是一类特殊的同余方程求解,普通的同余方程是ax≡b(mod n)ax\equiv b(mod\ n)ax≡b(mod n),乘法逆元的其...原创 2019-09-28 10:55:16 · 221 阅读 · 0 评论 -
树形DP
从五道题来看树形DP1.求树的最大值和最小值假设现在有一棵树,我只要求出每个结点作为头节点对应子树的最大值和最小值,那么最终答案一定在其中,因此每个结点都有两个信息,最大值和最小值,我把这个信息封装为一个结构体,带入递归中,就能求出最终答案,最大值就等于当前结点左子树的最大值和右子树的最大值和当前结点的值三者中最大的那一个,最小值也是三者中最小的那一个。public class Main {...原创 2018-11-03 21:24:34 · 517 阅读 · 0 评论 -
给定一个数组,求子数组的最大异或和
直接说这道题时间复杂度O(n)的做法,构建前缀树。假设将0-0、0-1、0-2、…、0-i-1的异或结果全部装在前缀树中,那么以i结尾的最大异或和就是0到某一位置x的异或结果和i异或结果最大,举个例子,假设x是3,0-3的异或结果和i进行异或得到的结果最大,那么就说明4-i的异或结果是最大的。但是如何知道x到底是多少,换句话说,0-x中哪个值和i进行异或得到的结果最大。其实这个也比较好想,假设i...原创 2018-11-02 13:10:02 · 1378 阅读 · 0 评论 -
从暴力递归到动态规划
动态规划没有那么难,但是很多老师在讲课的过程中讲的并不好,由此写下一篇文章记录学习过程1.题目链接:LeetCode518从暴力递归开始暴力递归就是尝试,这道题比较简单,从coins[0]开始尝试,coins[0]选0个,那么用剩下的coins[1…n]凑出amount的数量为a;coins[0]选1个,那么用剩下的coins[1…n]凑出amount-coins[0]的数量为b;coin...原创 2018-11-02 13:09:18 · 371 阅读 · 0 评论 -
子数组累加和为aim(小于等于aim)的三个问题
子数组累加和为aim(小于等于aim)的三个问题累加和等于aim的最长子数组的长度(数组可正可负可零)累加和等于aim的最长子数组的长度(数组只有正数)累加和小于等于aim的最长子数组的长度(数组可正可负可零)累加和等于aim的最长子数组的长度(数组可+,-,0)这道题我另有文章讲解了,这里就不多说了累加和等于aim的最长子数组的长度(数组只有正数)这个和上面唯一的不同就是数组中...原创 2018-11-02 13:08:54 · 406 阅读 · 0 评论 -
floyd算法
floydfloyd算法解决的问题是在图中找到从i号结点到j号结点最短路径值(边的权值)的问题,核心代码就下面四行for(int k = 0;k < n;k++) for(int i = 0;i < n;i++) for(int j = 0;j < n;j++) dp[i][j] = Math.min(dp[i][j],dp[i...原创 2018-11-02 13:08:33 · 1616 阅读 · 0 评论 -
堆及其相关应用
什么是堆? 提到堆就不得不说到二叉树这个结构,堆就是一颗完全二叉树,什么叫完全二叉树,用一句话来概括就是:设二叉树的深度为h,除第h层外,其它各层的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树,举几个例子: 堆分两种,一种叫大根堆,一种叫小根堆。大根堆就是在堆结构中,任意一棵子树的根节点一定是最大值,举个例子: 看上图最左边的那颗树,他的子树有64...原创 2018-08-21 08:44:21 · 251 阅读 · 0 评论 -
位与进制
位运算简介 这里我假设读者有二进制的思维,知道(3)~10~=(011)~2~将十进制转换为二进制的方法 - &(与)、|(或)、^(异或)、~(非/取反) - >>和<<运算符将二进制位进行右移或者左移操作 - >>>运算符将用0填充高位;>>运算符用符号位填充高位,没有<<<运算符 - 对于int型,1...原创 2018-08-21 08:44:05 · 734 阅读 · 0 评论 -
并查集(Union Find)
没想到有一天我也能搞懂并查集,orz……实际上本文算是《Algorithms》一书的读后感1.并查集概述 并查集的数学模型是一组不相交的动态集合S={A,B,…},它支持以下运算: 1. union(A,B):将集合A和集合B合并 2. find(x):找出包含元素x的集合 3. connected(A,B):返回A和B是否连通我们看一张图来具体说明 开始的情况是对...原创 2018-08-21 08:43:53 · 215 阅读 · 0 评论 -
枚举+优化(2)——哈希表优化
问题:查找一个元素是不是存在?unordered_set unordered_set可以想象成一个集合,它提供了三个函数让我们增删查,下面三个函数的时间复杂度都是O(1) 1. unordered_set::insert 2. unordered_set::find 3. unordered_set::erase#include <unordered_set>...原创 2018-08-12 10:11:34 · 328 阅读 · 0 评论 -
枚举+优化(1)——枚举
十位平方数 由0~9这10个数字不重复、不遗漏,可以组成很多10位数字。这其中也有很多恰好是平方数。 比如:1026753849,就是其中一个最小的平方数。 请你找出其中最大的一个平方数是多少?思路1枚举答案X [9876853210,1026753849](从最大的数枚举到最小的数)判断是不是恰好0-9十个数字判断是不是完全平方数 1) 令Y = int(sqrt(x...原创 2018-08-12 10:11:16 · 713 阅读 · 0 评论 -
并查集(Union Find)
没想到有一天我也能搞懂并查集,orz……实际上本文算是《Algorithms》一书的读后感1.并查集概述 并查集的数学模型是一组不相交的动态集合S={A,B,…},它支持以下运算: 1. union(A,B):将集合A和集合B合并 2. find(x):找出包含元素x的集合 3. connected(A,B):返回A和B是否连通我们看一张图来具体说明 开始的情况是对...翻译 2018-08-12 10:10:40 · 368 阅读 · 0 评论 -
位与进制
位运算简介 这里我假设读者有二进制的思维,知道(3)~10~=(011)~2~将十进制转换为二进制的方法 - &(与)、|(或)、^(异或)、~(非/取反) - >>和<<运算符将二进制位进行右移或者左移操作 - >>>运算符将用0填充高位;>>运算符用符号位填充高位,没有<<<运算符 - 对于int型,1...原创 2018-08-12 10:10:14 · 416 阅读 · 0 评论 -
堆及其相关应用
什么是堆? 提到堆就不得不说到二叉树这个结构,堆就是一颗完全二叉树,什么叫完全二叉树,用一句话来概括就是:设二叉树的深度为h,除第h层外,其它各层的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树,举几个例子: 堆分两种,一种叫大根堆,一种叫小根堆。大根堆就是在堆结构中,任意一棵子树的根节点一定是最大值,举个例子: 看上图最左边的那颗树,他的子树有64...原创 2018-08-12 10:09:16 · 324 阅读 · 0 评论 -
TRIE(1)
Trie又被称为前缀树或者字典树。它的基本作用是用来存储一个字符串集合:{W1, W2, W3, … WN},并且可以用来查询一个字符串S是不是在集合里 具体来说,Trie一般支持两个操作: 1. Trie.insert(W):第一个操作是插入操作,就是将一个字符串W加入到集合中 2. Trie.search(S):第二个操作是查询操作,就是查询一个字符串S是不是在集合中 由于Tri...原创 2018-08-14 10:36:26 · 431 阅读 · 0 评论 -
KMP(4)
例6 题目链接:POJ2752 这道题目的大意是给定一个字符串S,让找出所有既是S前缀又是S后缀的字符串。然后从小到大输出它们的长度 比如S=ababcababababcabab,既是前缀又是后缀的有ab, abab, ababcabab和S本身。所以输出的是2 4 9 18。再比如S=aaaaa,既是前缀又是后缀的有a, aa, aaa, aaaa和S本身。所以输出的是1 2 3 4...原创 2018-08-14 10:36:07 · 282 阅读 · 0 评论