
算法
mu6y
这个作者很懒,什么都没留下…
展开
-
AcWing 算法基础 dijkstra
dijkstra简介dijkstra算法是单源最短路径算法。单源即在一个有向图中,从一个节点出发,算法可求该节点至所有可到达节点的最短路径长度。与之相对的称为非单源最短路,即算法运行一次可求出任意节点至任意可到达节点的最短路长度,其代表是floyd算法。单源最短路有两种常见算法,dijkstra算法和bellman-ford算法。前者只能用于求路径权值全部为非负数的最短路,后者是可以求边权中...原创 2020-03-18 23:48:16 · 552 阅读 · 1 评论 -
AcWing 算法基础 拓扑排序
拓扑排序拓扑排序简介有序无环图有拓扑排序,拓扑排序是一个有向无环图的所有顶点的线性序列必须满足两个条件:每个顶点出钱且只出现一次若存在一条从顶点A到顶点B的路径,那么在序列中顶点A出现在顶点B前面有向无环图才有拓扑排序,非DAG没有拓扑排序如何得到拓扑排序从DAG图中选择一个没有前驱(入度为0)的顶点并输出从图中删除该顶点和所有以他为起点的有向边重复1,2,知道当前的DAG...原创 2020-03-18 21:35:07 · 215 阅读 · 0 评论 -
AcWing 算法基础 并查集
并查集并查集解决的问题将两个集合合并询问两个元素是否在一个集合中基本原理用树的形式来维护每个集合,树根的编号就是整个集合的编号,每个节点存储他的父节点,p[x]表示x的父节点问题1,如何判断树根:if(p[x] == x);问题2,如何求x集合的编号: while(p[x] != x) x = p[x];问题3,如何合并两个集合,px是x集合的编号,py是y的集合编号,令p[x...原创 2020-03-11 12:07:04 · 312 阅读 · 0 评论 -
AcWing 算法基础 KMP字符串
KMPKMP解决了一个什么问题假设有两个字符串,一个长字符串,一个短字符串,我们想要知道在这个长字符串中是否包含这个短字符串,就需要在长字符串中搜索短字符串。那么我们最容易想到的方法是什么呢,就是暴力法:public void main(){ //a为长字符串 String a = "ababababaab"; //b为短字符串 String b = "bab...原创 2020-03-10 23:37:01 · 263 阅读 · 0 评论 -
AcWing 算法基础 链表,栈与队列
链表,栈与队列的简单讲解单链表单链表是一种常见的数据结构,其包含自身所存储的值和指向下一个节点的指针如果该链表没有下一个节点,则指向null。链表的实现分为静态链表与动态链表,其中静态链表每个节点使用数组实现,动态链表的节点使用不连续的块内存(结构体或类)来实现。使用数组实现单链表数据结构单链表一般有三种操作,从头插入,从中间插入,删除操作AcWing 826单链表实现一个单链表,链表...原创 2020-03-09 17:42:41 · 158 阅读 · 0 评论 -
AcWing 算法基础 位运算
位运算简介位运算一般为二进制的位运算,根据某一位是0还是1进行计算。例题 二进制中1的个数给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。import java.util.*;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import...原创 2020-03-06 11:53:54 · 274 阅读 · 0 评论 -
AcWing 算法基础 离散化
离散化简介离散化是指在一个很大的区间上,只有一些稀疏的数字对我们是有用的,我们就可以对这个大范围做离散化,将该大区间中对我们有用的数字抽出来,形成一个新的数组。如上图所示,在一个黑色的大区间内,只有几个红色的数据对我们来说是有用的,所以我们可以将这些红色的数据从大区间中抽出来,组成一个新的序列,新序列的下标位原序列的位置。新序列的值位原序列中的相应位置的值。例题 区间和假定有一个无限长...原创 2020-03-06 11:53:11 · 401 阅读 · 0 评论 -
ACwing 算法基础 区间合并
区间合并介绍区间合并是指有多个区间,其中某些区间是可以合并为一个区间的。如下图所示的两个区间,其左区间右端点和右区间的左端点是交叉的,所以这两个区间就可以合并。我们首先通过区间的左端点进行排序,这样两个区间一共有三种情况:如果1区间的右端点大于2区间的左端点,如果1区间的右端点大于2区间的右端点,则两个区间可以合并为1区间。如果1区间的右端点大于2区间的左端点,如果1区间的右端点小...原创 2020-03-06 11:51:57 · 418 阅读 · 0 评论 -
双指针算法
双指针算法介绍双指针算法是指使用两个指针分别指向不同的位置,整个算法过程都维护这两指针,两个指针指向的位置有两类。如下图所示两个指针分别指向两个序列。两个指针指向同一个序列。//模板for(int i=0, j=0; i < n; i++){ if(j < i && check(i,j)) j++; //每道题的具体逻辑。}核心思...原创 2020-03-04 16:30:32 · 474 阅读 · 0 评论 -
大数运算
大数运算大数运算的概念大数运算指最特别大的数进行运算,一般超过计算机能表示的最大数字。核心思想是将这些数字放在一个集合或者数组中,在根据基本的加减乘除的计算规则对大数一位一位的进行计算。这里共整理的四个类型,均为ACwing上的算法基础课中的模板题Java自带大数类,所以这部分可以不是特别重要,但是也可以掌握一下。四种类型类:大数+大数大数-大数(答案可以为负数)大数*小数大数/...原创 2020-03-03 15:46:40 · 429 阅读 · 0 评论 -
二分法注意事项与具体实现(java)
二分法二分法主要有两种,一种是整数二分,一种是实数二分。整数二分整数二分有两种情况,求出的结果分别对应两种需求得到满足结果的最左侧下标。while(l < r){ int mid = (l+r)/2;//取中值 if(nums[mid] >= ans) r = mid;//这里有两种选择,两种选择的关键就是把等号划分到 > 这边还是 < 这边。...原创 2020-03-01 21:59:41 · 291 阅读 · 0 评论 -
逆序对--归并排序的具体应用
逆序对逆序对介绍对于数列 5,4,4,3,1,8。从其中选择两个数,如果第一个数比第二个数大,则该数对为逆序对。5,4 为逆序对5,3 为逆序对4,8 不是逆序对逆序对的计算流程大体流程使用归并排序的思想假设数组被分为左右两部分,左右两部分为排好序之后的情况以右侧数组为基准,在归并过程中,如果左侧的数字小于等于右侧的数字,则正常归并排序。如果右侧指针指向的数字小于...原创 2020-03-01 18:42:24 · 160 阅读 · 0 评论 -
归并排序算法实现
归并排序算法步骤:确定分界点 mid = (l+r) / 2;递归排序 left与right;归并–合二为一知识点:稳定排序与不稳定排序,没什么用稳定排序算法:两个相等的数在排序后前后位置没有交换。常见的稳定排序算法:冒泡排序,插入排序,归并排序,基数排序不稳定排序算法:与上面的相反。常见的不稳定排序算法:选择排序,快速排序,希尔排序,堆排序双指针算法import jav...原创 2020-02-29 16:34:25 · 212 阅读 · 0 评论 -
快速排序与快速选择算法
快速排序算法步骤:找到分界点x,x可以为q[L],q[L+R],q[R];左边所有数Left <= x,右边所有数Right >= x;递归排序Left,递归排序Right。以下为两种方法实现快速排序方法一:填坑法import java.util.*;import java.io.BufferedReader;import java.io.IOException...原创 2020-02-29 13:51:41 · 180 阅读 · 0 评论