![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 79
不会JAVA的运营不是好数分
这个作者很懒,什么都没留下…
展开
-
深度优先搜索和宽度优先搜索
深度优先搜索和宽度优先搜索bfs和dfs都是遍历图的方法。dfs是不撞南墙不回头,bfs慢慢来,一层一层来。类型空间(h为高度)时间(h为高度)采用的数据结构特点DFSO(h)O(2h2^h2h)栈不具备最短路BFSO(2h2^h2h)O(2h2^h2h)队列“最短路”说明:bfs只能做权重为1或者相同的 “最短路”空间上:dfs 复杂度为最大深度 h。这也是stack最大容量。bfs 复杂度为 2^h。因为满二叉树 最下面一层为原创 2022-01-14 16:23:59 · 1044 阅读 · 0 评论 -
整数与浮点数二分算法
整数二分作用为:利用二分搜索的思想。来找到一个数特殊数的左右边界。例如: {1,2,3,3, 4,5,8,10}找到值为3的左边界序号为1,右边界序号3。如何找到左右边界呢.发现, 3的左边是 小于等于3的(性质1) 且 3的右边是大于等于3的(性质2)步骤## 模板int x;//目标值// 查找左边界//查找大于等于/大于key的第一个元素int bsearch_1(int l, int r){ while (l < r) { int m原创 2022-01-13 15:56:01 · 212 阅读 · 0 评论 -
数组模拟链表、栈、队列、单调队、栈
数组模拟链表、栈、队列、单调队、栈——打印资料数组和链表的优劣对比参考:https://zhuanlan.zhihu.com/p/73514867数组的特点:在内存中,数组是一块连续的区域。插入和删除数据效率低(插入数据时,这个位置后面的数据都要后移)**查询效率很高。**因为数组是连续的,知道每一个数据的内存地址,可以直接找到给地址的数据(直接索引就能实现,不需要重头遍历)。不利于扩展,一开始数组定义的空间不够时要重新定义数组。会造成冗余。空间浪费。链表的特点:在内存中,不要求连原创 2022-01-12 15:51:49 · 411 阅读 · 0 评论 -
高精度算法
高精度高精度适用情况大数的长度最长为 10^6位高精度加法通过对数位分别储存运算,并维护一个用于处理进位的变量,从而在不造成溢出的前提下实现大数相加。Java和Python中虽然不需要考虑大整数相加的溢出问题,但这种算法的思想很值得借鉴。高精度储存从高位对应着 数据中表示也是高位。当然输出的时候需要倒叙输出[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HGw3PIPX-1641802022731)(…/…/…/图库/1590506552684.png)原创 2022-01-10 16:07:24 · 341 阅读 · 0 评论 -
反素数 Antiprime
反素数题目描述原题来自:POI 2001如果一个大于等于 111 的正整数 nnn,满足所有小于 nnn 且大于等于 111 的所有正整数的约数个数都小于 nnn 的约数个数,则 nnn 是一个反素数。譬如:1,2,4,6,12,241, 2, 4, 6, 12, 241,2,4,6,12,24,它们都是反素数。请你计算不大于 nnn 的最大反素数。输入一行一个正整数 nnn。输出只包含一个整数,即不大于 nnn 的最大反素数。样例1000840提示数据范围与提示:对于 10原创 2021-12-28 18:54:31 · 611 阅读 · 0 评论 -
2020年11月21日 纪念日——线性筛选质数
2020年11月21日 纪念日——线性筛选质数有点丢人,讲题之前没有讲明白,然后在很多人之前丢了大脸。以此时作为纪念吧。共勉之。某个算法,只有思考过,AC过,再思考。才可能明白吧。开始记录下线性筛选质数:基础知识质数质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。合数与质数相对的就是合数。最小因数定理——一个数的最小因数一定是质数一个大于1的自然数,最小的因数一定是质数。证明如下:我们来把它编 成一道证明题 ,并利用列举法和反证法 求证。求证:除原创 2020-11-22 17:29:23 · 204 阅读 · 0 评论 -
scanf读取字符的技巧——防止有字符前有空格
scanf读取字符的技巧——防止有字符前有空格问题背景:经常读入数据的时候,会遇到scanf读入数据带有间隔情况,如下:输入:x x x 或者 x x x此时只有一个或者多个空格,那么:解决方法:使用cin或者使用 scanf(" %c",&c); ' '是可以忽略一个或者多个空格#include<bits/stdc++.h>using namespace std;char c;int main(){ for (int i = 0; i < 3;原创 2020-11-17 20:27:00 · 1758 阅读 · 0 评论 -
kmp算法思考和参考总结
AcWing 831. KMP字符串所谓字符串匹配,是这样一种问题:“字符串 P 是否为字符串 S 的子串?如果是,它出现在 S 的哪些位置?” 其中 S 称为主串;P 称为模式串。下面的图片展示了一个例子。暴力做法:双重循环双重循环劣势如下:双重循环的时候,如果主串S和模式串P不匹配,则如果S会上次匹配地方为i,那么本次匹配时,S串会从i+1开始匹配。对于暴力算法,如果出现不匹配字符,同时回退 S 和 P 的指针,嵌套 for 循环,时间复杂度 O(MN)O(MN)O(MN),空间复杂原创 2020-11-16 21:38:14 · 238 阅读 · 0 评论 -
单调栈和单调队列
单调栈给定一个数列,找到每一个数左边比他小,且离它最近的数。这个问题可以这样抽象思考,把它变为求一个数组中Next Greater Number,也就是大于该元素,且离它最近的元素下标。把数组的元素想象成并列站立的人,元素大小想象成人的身高。这些人面对你站成一列,如何求元素「2」的 Next Greater Number 呢?很简单,如果能够看到元素「2」,那么他后面可见的第一个人就是「2」的 Next Greater Number,因为比「2」小的元素身高不够,都被「2」挡住了,第一个露出来的就是答原创 2020-11-15 22:33:07 · 98 阅读 · 0 评论 -
链表和邻接表,队列和栈
链表和邻接表,队列和栈单链表——利用数组模拟e数组代表节点的值ne数组代表下一点的位置head表示头节点的下标初始化插入到头节点位置将x插入到下标是k的点后面将下标是k的点后面的点,删掉双向链表l表示前向指针,r表示后向指针指向的点的下标。e数组代表点的值。它也有若干操作如下:邻接表就是有head数组,head存的某个头节点下一个节点。栈和队列栈利用数组来模拟栈如下:(其中tt代表栈顶的下标)队利用数组来模拟队列。 hh队头,tt队尾 。.原创 2020-11-15 21:06:25 · 197 阅读 · 0 评论 -
乘法的逆元和费马小定理
乘法的逆元和费马小定理同余运算乘法逆元逆元和我们平时所说的倒数是有一定的区别的,我们平时所说的倒数是指**:a*(1/a) = 1**,那么逆元和倒数之间的区别就是:假设x是a的逆元,那么 a * x = 1(mod p),也就是只多了一个取余的操作,这个取余的操作,就会保证a的逆元不一定只是a的倒数。那么我们的逆元有什么作用呢?费马小定理需要注意:a的逆元为 a^(p-2) mod p求 a ^ (p-2)一般会适用快速幂,因为p一般是个很大的数...原创 2020-06-08 21:37:18 · 240 阅读 · 0 评论 -
二分图原理及应用
二分图什么是二分图?G=(V, E),其中G代表图,V代表这个图的所有顶点的集合,E代表这个图所有连线的集合,即是边集。现如今如果能将V这个顶点集分成两个互不相交的子集A、B,E这个边集内所有边的两个顶点分别属于*A、B两个子集的话,我们就称这个图为二分图。要点无向图所有点分成A,B两个不相交的集合所有边,都在着两个集合之间。同一个集合不能有边。二分图应用如何检测二分图? 染色二分图最大匹配?匈牙利算法如何检测二分图?染色法如果我们能够把图中的所有顶点分成两部分,原创 2020-06-03 11:32:19 · 3894 阅读 · 4 评论 -
最短路:算法基本原理和比较
最短路基本原理和比较总体而言,对于一个n点m条边的图来说。最短路分为:单源和多源。按适用条件划分如下:需要注意的事项和基本原理Dijkstra-朴素O(n^2) 初始化距离数组, dist[1] = 0, dist[i] = inf; for n次循环 每次循环确定一个min加入S集合中,n次之后就得出所有的最短距离 将不在S中dist_min的点->t t->S加入最短路集合 用t更新到其他点的距离Dijkstra-堆优化O(ml原创 2020-06-03 08:31:13 · 437 阅读 · 0 评论 -
最短路:朴素Dijkstra和堆优化版Dijkstra
朴素Dijkstra和堆优化版Dijkstra总体思路将所有的顶点分为两个部分:已知最短距离的顶点集合P和未知最短距离的顶点集合Q。最开始的时候,已知最短距离的顶点集合中只有源点。初始化distance数组,将源点s到自己的距离设置为0,到其他顶点的距离姑且设置为Infinity。依据distance数组,在未知顶点集合Q中选出距离源点最近的一个顶点u,放入P中,并考察所有以u为起点的边,以u作为中转点,检验是否能够减短源点到其他点的距离。如果有,就更新distance数组。这一步又叫松弛(rel原创 2020-06-03 08:24:10 · 371 阅读 · 1 评论 -
最短路:Floyd求多源最短路
Floyd求多源最短路算法特点时间复杂度:时间复杂度为O(n^3);可以求多源最短路想法思想从任意节点i到任意节点j的最短路径不外乎2种可能,1是直接从i到j,2是从i经过若干个节点k到j。所以,我们假设dist(i,j)为节点u到节点v的最短路径的距离,对于每一个节点k,我们检查dist(i,k) + dist(k,j) < dist(i,j)是否成立,如果成立,证明从i到k再到j的路径比i直接到j的路径短,我们便设置dist(i,j) = dist(i,k) + dist(k原创 2020-06-03 08:22:13 · 174 阅读 · 0 评论 -
最短路:Bellman-Ford和SPFA求最短路和负环
Bellman-Ford和SPFA求最短路Bellman-Ford时间复杂度 O(nm), n 表示点数,m 表示边数最大特点:能找到负环得到不超过k条路的最短路,例如:要求解决最多只能完成K次飞行,在完成K飞行时的最短路。注意:backup是备份上一次的dist数组。int n, m; // n表示点数,m表示边数int dist[N]; // dist[x]存储1到x的最短路距离struct Edge{ int a, b, w;} edge原创 2020-06-03 08:20:47 · 249 阅读 · 0 评论 -
循环相除得最大公约数
循环相除得最大公约数//返回最大公约数int gcd(int x,int y){ if(y==0) return x; return gcd(y,x%y);}循环相除的应用求两个数互质。那么两个数的最大公约数应该为 1原创 2020-06-02 12:35:05 · 302 阅读 · 0 评论 -
P1090 合并果子 - 贪心
P1090 合并果子 / [USACO06NOV]Fence Repair Ghttps://www.luogu.com.cn/problem/P1090题目意思:若干堆果子,如何移动让自己最轻松。两堆合为1堆。消耗体力为两堆数量之和。z最终需要合为一堆。思想——类似霍夫曼树排序。每次用最小和次小的数相加。取代这两数,排序。s不断累加。//P1090 合并果子 / [USACO06NOV]Fence Repair G// Created by majoe on 2020/5/1.原创 2020-06-02 12:24:20 · 334 阅读 · 0 评论 -
完全背包问题和优化
完全背包问题题意选取的物品无限求价值最大值分析图解难点:状态计算——第i个物品选(0 - k)个。那么k*v【i】 <= 背包剩余空间第i个物品,选k个那么需要加上 k个物品的价值朴素的算法/*f[i - 1][j] 一个都不选 k == 0f[i - 1][j - v[i] * k] + w[i] * k 选1 ~ k个 1 <= k <= s[i]*/#include <iostream>using namespace std;原创 2020-06-02 12:18:53 · 1050 阅读 · 4 评论 -
分组背包原理
分组背包有N种物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。算法思想这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k]/[v]表示前k组物品花费费用v能取得的最大权值,则有:f[k][v]=max{f[k-1][v],f[k-1][v-c[i]]+w[i]|物品i属于第k组}使用一维数组的伪代码如下原创 2020-06-02 12:16:53 · 252 阅读 · 2 评论 -
多重背包原理及优化思想
多重背包题意有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。基本想法这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:f[i][v]=max{f[i-1][v-k*c[i]]+k*w原创 2020-06-02 12:09:47 · 323 阅读 · 0 评论 -
01背包原理及动态数组优化
01背包问题描述有N件物品和一个容量为V的背包。第i件物品的体积是v[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。这是最基本的背包问题,每个物品最多只能放一次。想法DP分析状态——f【i】【j】从前i个物品中选总体积不超过j的所有选法转移方程f[i][j] = max(f[i][j],f[i-1][j-v[i]]+w[i])朴素代码——二维数组#include <iostream>using原创 2020-06-02 12:06:47 · 236 阅读 · 0 评论 -
区间DP 原理和套路
区间DP题目是有n堆石子排成一列,每堆石子有一个重量w[i], 每次合并可以合并相邻的两堆石子,一次合并的代价为两堆石子的重量和w[i]+w[i+1]。问安排怎样的合并顺序,能够使得总合并代价达到最小。分析f[i,j]表示所有所有将第i堆到第j堆石子合并成一堆石子的合并方式枚举【i,j】的长度从 2 - n第i堆到第j堆石子合并成一堆石子的合并方式,一共三步1 第i - k 凑成一堆最小值2 第 k+1 - j 凑成一堆的最小值3 两堆合起来。就是 【i,j】所有数之和。可以用前缀原创 2020-06-02 12:03:59 · 595 阅读 · 0 评论 -
树形DP一般解题思路
树形DP定义整个题目给出,是一棵树。一般而言:以节点从深到浅(子树从小到大)的顺序作为dp的阶段;dp状态表示中,第一维通常是节点的编号(代表以该节点为根的子树。)大多数时候,采用递归的方式实现树形dp。dp[i]/[j] (i通常是节点的编号),j代表状态(例如是否选择了第i个节点)这个状态j一般有两个状态,0没选,1选了模板没有上司的舞会一家公司有n个员工,编号为1~n。他们的关系就像一棵以校长为根的数,父节点就是子节点的直接上司。每个员工都有一个快乐指数。现在要开一个原创 2020-06-02 11:17:17 · 617 阅读 · 0 评论 -
拓扑排序原理
拓扑排序在图论中,**拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)**的所有顶点的线性序列。且该序列必须满足下面两个条件:1、每个顶点出现且只出现一次。2、若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。算法思想拓扑排序流程为BFS流程如下1 首先找到第一个入度为0 的点 放入待处理队列,记录答案拓扑数组中原创 2020-06-02 11:08:23 · 329 阅读 · 0 评论 -
图的储存-邻接表和邻接矩阵
图的储存图的建立有两个问题要解决。用什么数据结构存储 (邻接表和邻接矩阵)图有有两种类型。有向图和无向图应该如何表示。 (无向图表示,两点互相有边指向,这样可以统一都用有向图的方式来储存)储存结构如果有n个点,m条边的图。他们可以用邻接表和邻接矩阵表示。邻接矩阵g[a][b] 存储边a->b时间复杂度O(n^2)邻接表(用数组来模拟链表)其实和链式前向星是一回事,如果不明白。可以去看看那个笔记的图。用数组来模拟链表head[i]表示以i为起点的头节点。也就原创 2020-06-02 11:07:16 · 362 阅读 · 0 评论 -
链式前向星原理和遍历
链式前向星作用储存图中边的数据结构。举例由如下图,需要将其关系进行储存储存关系如下:解释如下:head[i]表示以i为起点的第一条边int to; //这条边的终点int w; //权值int next; //兄弟边结构如下定义边的结构体将边加入前向星中遍历前向星边的结构体struct EDGE{ int to; //这条边的终点 int w; //权值 int next; //兄弟原创 2020-06-02 11:04:36 · 728 阅读 · 0 评论 -
DFS和BFS 原理探究和比较
深度优先搜索和宽度优先搜索bfs和dfs都是遍历图的方法。说明:bfs只能做权重为1或者相同的 “最短路”空间上dfs 复杂度为最大深度 h。这也是stack最大容量。bfs 复杂度为 2^h。因为满二叉树 最下面一层为 2^(h-1)个节点。 这是个queue最大容量。bfs——广度优先算法(暴搜)适合解决最小步数问题。(bfs只能做权重为1或者相同的 “最短路”)比dfs用时间更短。dfs是穷举。到一个点需要3步,那么bfs会在第三层就找到。算法思路原创 2020-06-02 11:01:34 · 861 阅读 · 0 评论 -
位运算一般两种用法
位运算位运算就是将数,化为二进制运算。6 = (110)二进制表示 一般是两种方式运用求n的第k位数字: n >> k & 1返回n的最后一位1:lowbit(n) = n & -nlowbit(n)6的二进制是110,所以lowbit(6)=2。也就是10.~x是取反的意思...原创 2020-06-02 10:51:14 · 128 阅读 · 0 评论 -
双指针原理和应用
双指针双指针算法思想实用i,j两个变量,不会退的扫描一个数组常规写法for(int i=0,j=0,i<n;i++){ while(j<i&&check(i,j)) j++;}这是i,j分别两端的写法int i=0,j=n-1;while(i<j){ if(check(i,j)) i++; else j--;}双指针应用分类常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列原创 2020-06-02 10:48:13 · 1955 阅读 · 2 评论 -
区间合并原理和规律
区间合并题目很好理解:我们解决区间问题的一般思路是先排序,然后观察规律想法贪心具体就是按着起点排序如果前一个终点< 下一个起点。那么单独成为一个区间。更新 起点如果前一个终点>= 下一个起点. max(end1,end2)。更新终点一个区间可以表示为 [start, end],以便满足贪心选择性质。而对于区间合并问题,其实按 end 和 start 排序都可以,不过为了清晰起见,我们选择按 start 排序。排序完成后:简单来说就是这样:#include<io原创 2020-06-02 10:43:29 · 2129 阅读 · 0 评论 -
AT2412 最大の和 -前缀和
AT2412 最大の和https://www.luogu.com.cn/problem/AT2412题意一个数组,求连续k个数字的最大和想法前缀和+遍历构造这个数组的前缀遍历【i-k+1,i】的和,找到最大的和//AT2412 最大の和// Created by majoe on 2020/5/27.//https://www.luogu.com.cn/problem/AT2412#include <bits/stdc++.h>using namespace s原创 2020-06-02 09:07:37 · 282 阅读 · 0 评论 -
前缀和及差分原理和应用
前缀和前缀和的思路是这样的,对于一个给定的数组 a,我们额外开辟一个前缀和数组进行预处理:前缀和 sum[i]代表【1~i】的a的和。推导如下:前缀和应用求任一子区间的和。S【r】 - s【l-1】 = a【l】+ … + a【r】模板S[i] = a[1] + a[2] + ... a[i]a[l] + ... + a[r] = S[r] - S[l - 1] 二维数组前缀和和一维前缀和类似。可以求连续子区间的和。但是需要减去重合的部分。模板S[i, j] =原创 2020-06-02 09:03:43 · 759 阅读 · 0 评论 -
高精度的四则运算
高精度高精度四则运算通过对数位分别储存运算,并维护一个用于处理进位的变量,从而在不造成溢出的前提下实现大数四则运算。Java和Python中虽然不需要考虑大整数四则运算的溢出问题,但这种算法的思想很值得借鉴。高精度储存从高位对应着 数据中表示也是高位。当然输出的时候需要倒叙输出int main(){ // 使用字符串读入 string a, b; vector<int> A, B; cin >> a >> b; //原创 2020-06-02 08:58:13 · 322 阅读 · 0 评论 -
离散化原理
离散化背景适用范围:数组中元素数值很大,但个数不是很多。比如将a[]=[1,3,100,2000,500000]映射到[0,1,2,3,4]这个过程就叫离散化。算法思想本质是一种哈希算法离散化,就是当我们只关心数据的大小关系时,用排名代替原数据进行处理的一种预处理方法。离散化本质上是一种哈希,它在保持原序列大小关系的前提下把其映射成正整数。当原数据很大或含有负数、小数时,难以表示为数组下标,一些算法和数据结构(如BIT)无法运作,这时我们就可以考虑将其离散化。离散化的关键问题:1.a[]原创 2020-06-02 08:53:43 · 1269 阅读 · 0 评论 -
二分和排序
快速排序算法思想基于分治总体步骤的话确定分界点调整分区递归步骤1、x = q[l + r >> 1],i = l - 1,j = r + 1; (i = l-1,j = r+1。是因为下面,do i++,先加了再说。所以这里。先把其移动到l,r的两侧)2、分治(小于x的放到左边,大于x的放到右边)。3、分别递归左右两边。模板void quick_sort(int q[], int l, int r){ if (l >= r) return; //原创 2020-05-25 19:03:52 · 1103 阅读 · 0 评论