算法
文章平均质量分 67
全面覆盖考研面试以及leetcode算法,碾压一切机试笔试算法题
代码kobe
爱数学的代码科妹
展开
-
算法基础集训(第31天)------>BFS之经典【走迷宫】
给定一个n×m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于左上角(1,1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角(n,m)处,至少需要移动多少次。数据保证(1,1)处和(n,m)处的数字为0,且一定至少存在一条通路。简而言之:从起点到终点,中间有些路径有障碍物。原创 2023-02-03 17:15:00 · 770 阅读 · 0 评论 -
算法基础集训(第30天)------>DFS之经典【n皇后问题】
n−皇后问题是指将n个皇后放在n×n的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。原创 2023-02-01 17:15:00 · 427 阅读 · 0 评论 -
算法基础集训(第29天)------>DFS之排列数【DFS入门级算法,初学者必会】
该题对于排列数的定义是对给定的数字n,将从1~n的数字进行全排列并输出。原创 2023-01-31 13:43:07 · 391 阅读 · 0 评论 -
算法基础集训(第28天,共106天)------>并查集入门二:【中通块中点的数量】,同属于并查集题型,深受面试官和算法比赛的青睐
一:概念定义参考一文即可二:题目描述给定一个包含 n 个点(编号为 1∼n)的无向图,初始时图中没有边。C a b,在点 a 和点 b 之间连一条边,a 和 b 可能相等;Q1 a b,询问点 a 和点 b 是否在同一个连通块中,a 和 b 可能相等;Q2 a,询问点 a 所在连通块中点的数量;第一行输入整数 n 和 m。接下来 m 行,每行包含一个操作指令,指令为C a b,Q1 a b或Q2 a中的一种。对于每个询问指令Q1 a b,如果 aa 和 bb 在同一个连通块中,则输出Yes。原创 2022-09-12 17:00:00 · 165 阅读 · 1 评论 -
算法基础集训(第27天,共106天)------>轻松入门常考算法【并查集】,代码精简,思维精巧,深受比赛和面试官的青睐
并查集的两个常见操作:1.将两个集合合并2.询问两个元素是否在同一个集合中基本原理:每个集合用一棵树表示,树根的编号就是整个集合的编号,每个节点存储它的父亲节点,p【x】表示x的父节点,如下图:二:题目描述一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。M a b,将编号为 aa 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;Q a b,询问编号为 a 和 b 的两个数是否在同一个集合中;输入格式第一行输入整数 n 和 m。原创 2022-09-11 15:14:09 · 433 阅读 · 0 评论 -
算法基础集训(第26天,共106天)------>彻底搞懂Trie树之【最大异或对】,附详细思路和图文代码解析
异或:两个数字转化为二进制数,从低位开始进行异或运算。异或也算也可称之为不进位加法。原创 2022-09-10 21:45:06 · 313 阅读 · 0 评论 -
算法基础集训(第25天,共106天)------>彻底搞懂Trie树,字符串数量统计
Trie可用于统计字符串集合某一字符串的出现次数,和kmp同属于字符串算法。原创 2022-09-08 16:38:33 · 184 阅读 · 0 评论 -
算法基础集训(第24天,共106天)------>彻底搞懂初学者的噩梦《kmp》算法,手撕kmp
求子串是常用算法之一,是基础中的难题,朴素方法求子串是使用两个for循环,最终会导致超时,当m和n太大,程序运行就比较笨重,本质原因是朴素算法每次都需要对模串的指针回溯,重复比较了一些之前比较过的东西,而今天要讲的kmp算法,指针不需要回溯到模串的头部,使用(后面细说这个代码的含义,也是代码比较难以理解的一部分)即可。原创 2022-09-06 17:05:43 · 478 阅读 · 1 评论 -
算法基础集训(第23天,共106天)------>彻底搞懂【滑动窗口】的【单调队列】模型
前面文章【队列】已经生动描述了队列的特点和基本操作,顾名思义,单调队列的意思就是队列中时刻保持单调性,和前面的文章【单调栈】类似特点,但是处理手法略有不同。原创 2022-08-29 17:09:54 · 373 阅读 · 3 评论 -
算法基础集训(第22天,共106天)------>彻底弄懂【单调栈】模型
单调栈可分为:单调递增栈和单调递减栈单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大但是名字其实不重要,做题目只需判断存储的数据从站栈底到栈顶的单调情况即可...原创 2022-08-27 17:15:00 · 210 阅读 · 1 评论 -
算法基础集训(第21天,共106天)------>彻底搞懂【队列】,采用数组模拟的方式,图文并茂,常规队列请私信我拿pdf课程笔记
普通队列,链式队列,循环队列。本篇文章着重讲解在数组模拟普通队列方面的做法,后期会讲解c++中的STL的queue,但是为了照顾java和python的同学,采取数组模拟的方式进行讲解,但是整体内容还是比较简单的。队列是一种先进先出的数据结构(FIrst In First Out,FIFO)数据的插入只能在队列的尾部进行数据的删除只能在队列的头部进行。...原创 2022-08-27 11:30:00 · 270 阅读 · 0 评论 -
算法基础集训(第20天,共106天)------>彻底搞懂【栈】,采用数组模拟的方式,图文并茂,常规栈请私信我拿pdf课程笔记
栈一般形式有和本篇文章主要讲解数组模拟栈,一般来说,数组可以做栈能做到的所有事情,栈不能做数组能做到的所有事情,在后面的文章我们会讲解如何利用c++的STL的stack来直接方便的使用栈这一数据结构,但是照顾python和java和c的同学,数组模拟栈也是非常便捷的。栈的主要元素包括栈顶和栈顶,主要操作(进出)都是在栈顶执行的,如下图。.........原创 2022-08-26 17:15:00 · 443 阅读 · 0 评论 -
算法基础集训(第19天,共106天)------>彻底搞懂【双链表】,采用数组模拟的方式,图文并茂,常规结构体链表请私信我拿pdf课程笔记
双向链表也是链表的一种,它每个数据结点中都有两个指针域,分别指向其直接前驱和直接后继。所以我们从双向链表的任意一个结点开始都可以很方便的访问其前驱元素和后继元素。原创 2022-08-26 11:30:00 · 391 阅读 · 1 评论 -
算法基础集训(第18天,共106天)------>彻底搞懂【单链表】,采用数组模拟的方式,图文并茂,常规结构体链表请私信我拿pdf课程笔记
从结构体的角度分析面试时的链表:1.链表用一组地址任意的存储单元存放线性表中的数据元素。2.数据a的存储映像称为结点,含数据域和指针域。指针域存储直接后继结点的存储位置。3.n 个结点由指针链组成一个链表。它是线性表的链式存储映像,称为线性表的链式存储结构。4.结点只有一个指针域的链表称为单链表。5.有两个指针域的链表称为双链表。6.首尾相接的链表称为循环链表。7.还有如下名词8.设置头节点的好处:a.便于首元结点的处理,首元结点的地址保存在头结点的指针域中,原创 2022-08-25 10:29:30 · 772 阅读 · 6 评论 -
算法基础集训(第17天,共106天)------>轻松学会【区间合并】,附上图文以及详细思路解析和代码解析,搞不懂来找我
合并所有有交集的区间。例如【2,4】和【3,7】,取其并集得到【2,7】为最终结果画个图帮助理解给定 n 个区间 [,l,r],要求合并所有有交集的区间。注意如果在端点处相交,也算有交集。输出合并完成后的区间个数。例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。第一行包含整数 n。接下来 n 行,每行包含两个整数 l 和 r。共一行,包含一个整数,表示合并区间完成后的区间个数。原创 2022-08-24 10:04:58 · 479 阅读 · 0 评论 -
算法基础集训(第16天,共106天)------>彻底搞懂【离散化】类型的区间和问题,详细思路+题解+常见问题分析+万年无误代码模板
简单来说,就是把一些非常零散的点重新分配到从1~n的自然数,这个分配过程也可以称作映射,比如坐标轴范围是-10^9~10^9,但是其中有实际数值的坐标只有十个,我们把这个十个数字映射到1~10即可。原创 2022-08-22 16:53:49 · 708 阅读 · 0 评论 -
算法基础集训(第15天,共106天)------>带你轻松入门位运算,本篇文章主要讲解位运算的基本知识和基本操作
举例:n是12,二进制表示是1100,因此最后一位1就是100我们用lowbit(x)来实现该问题,可以先看下图方便理解原创 2022-08-21 16:50:10 · 152 阅读 · 0 评论 -
算法基础集训(第14天,共106天)------>彻底搞懂【双指针算法】的使用场景和使用方法,附大量思路分析和习题总结
对于双指针来说,主要应用有和。对于单个数组而言,就是定义两个指针,相向或相同移动,不断进行问题的判断或者计算,最终求出问题的解。对于两个个数组而言,就是定义两个指针,从两个数组的头部开始移动,不断判断进行求解对于链表而言,就是定义两个指针,一快一慢(即快慢指针),不断进行迭代求解。注:双指针实际上就是i和j的移动。原创 2022-08-20 17:00:36 · 921 阅读 · 1 评论 -
算法基础集训(第13天,共106天)------>带你彻底弄懂【差分】之【差分矩阵】:许多高校的的比赛甚至面试题都有考过手写代码 题目+分析+万年模板应有尽有
我们定义:a【】数组是b【】数组的前缀和,也就是a【i】【j】的值是以b【i】【j】为右下角端点的矩阵的的和。原创 2022-08-18 17:09:59 · 340 阅读 · 0 评论 -
算法基础集训(第12天,共106天)------>带你轻松入门【差分】:许多高校的新生赛暨校赛都有考过此题
差分类似于前缀和的逆运算。原创 2022-08-16 17:23:17 · 285 阅读 · 0 评论 -
算法基础集训(第11天,共106天)------>带你彻底搞懂【前缀和】之【子矩阵的和】,很多高校的校赛都考过
2.利用图形的分析思想,得到sum【a】【b】=a【a】【b】+sum【a-1】【b】+sum【a】【b-1】−sum【a-1】【b-1】如果用淳朴的思路,从a【x1】【y1】累加到a【x2】【y2】当然可以,但是数据量如果比较大就会超时,因此需要预处理来简化后续的累加行为。注意:我们这里预处理是直接从a【1】【1】开始的,从a【0】【0】开始也行,但是由于出现下标是负数的情况,所以还需要提前声明一下。假设sum【i】【j】表示从a【0】【0】到a【i】【j】这个区域的和,我们就容易得到如下递推式。...原创 2022-08-14 17:19:03 · 415 阅读 · 0 评论 -
算法基础集训(第10天)------>带你轻松入门【前缀和】这一求和杀器
今天要学习的是算法前缀和,先讲解入门内容,部分前缀和原创 2022-08-13 17:15:10 · 91 阅读 · 0 评论 -
算法基础集训(第9天)------>彻底搞懂【高精度除法】本文采用c++实现,因为java和python有内部高精度算法的库函数
答:高精度除法法适用于数位很多的数字的除法,比如两个数字a和b,len(a)= 100,说明a有一百位,显然int和long long int都无法存储这么大的数据,这时候这需要高精度除法来实现对两个数字的相除。在实际算法中,一般默认一个数字的数位特别大但是另一个数字的数位不算大。4.其余精度算法都是从低位开始循环,但是除法的循环是从高位开始循环。3.高精度乘法的算法默认一个数值的位数很多,另一个位数不多。1.用a以字符串的形式读入,b直接以整数的形式读入。...原创 2022-08-12 17:25:43 · 518 阅读 · 0 评论 -
算法基础集训(第08天)------>彻底搞懂【高精度乘法】本文采用c++实现,因为java和python有内部高精度算法的库函数
答:高精度乘法法适用于数位很多的数字的乘法,比如两个数字a和b,len(a)= 100,说明a有一百位,显然int和long long int都无法存储这么大的数据,这时候这需要高精度乘法来实现对两个数字的相乘。在实际算法中,一般默认一个数字的数位特别大但是另一个数字的数位不算大。...原创 2022-08-12 17:05:08 · 484 阅读 · 0 评论 -
算法基础集训(第07天)------>彻底搞懂【高精度减法】本文采用c++实现,因为java和python有内部高精度算法的库函数
答:高精度加法适用于数位很多的数字的减法,比如两个数字a和b,len(a)= 100,说明a有一百位,显然int和long long int都无法存储这么大的数据,这时候这需要高精度减法来实现对两个数字的相减。注:python和java内部有高精度减法的库函数,所以不需要实现,但是c++没有,需要手动实现相对于高精度加法,减法需要多定义一个函数cmp,用来先比较两个数字的大小。.........原创 2022-08-11 20:11:05 · 370 阅读 · 0 评论 -
算法基础集训(第06天)------>带你彻底弄懂【高精度加法】
答:高精度加法适用于数位很多的数字的加法,比如两个数字a和b,len(a)= 100,说明a有一百位,显然int和long long int都无法存储这么大的数据,这时候这需要高精度加法来实现对两个数字的相加。注:python和java内部有高精度加法的库函数,所以不需要实现,但是c++没有,需要手动实现。.........原创 2022-08-09 16:40:13 · 199 阅读 · 0 评论 -
算法基础集训(第05天)------>全网最全【二分】万字详解,超多经典例题和拓展题:包括两个神仙模板和各种让你头痛的边界情况,最后还有STL内部封装函数
二分查找解决的是单调函数上的查找问题。然后就有人问了,我遇到的二分查找都是在数组中找一个数,这个也是函数吗?广义地来说,数组就是一些离散的点,所以它是一种离散函数。所以,数组元素的查找其实也是在函数中进行查找。二:整数二分查找的两个万能模板(借鉴试用多年,从未出错)二分模板一共有两个,分别适用于不同情况。算法思路:假设目标值在闭区间[l, r]中, 每次将区间长度缩小一半,当l = r时,我们就找到了目标值。模板1(往左找答案):当我们将区间[l, r]划分成[l, mid]和时,其更新操作是。......原创 2022-08-08 20:30:00 · 1294 阅读 · 0 评论 -
算法基础集训(第04天)------>一篇文章带你彻底搞懂【逆序对问题】
答:举个例子(4 5 6 | 1 2 3),发现左区间最小的4比右区间的1大,则左区间4以及4之后的所有数字都可以和1形成逆序对,代码表示就是。注:和归并排序没有什么区别,仅仅是多了一行res+=mid-i+1,其中res记录逆序对的数量。给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量。3. 算一个左一个右的;4. 把他们加到一起;1. 递归算左边的;2. 递归算右边的;...原创 2022-08-06 18:45:00 · 118 阅读 · 0 评论 -
算法基础集训(第03天)------>【归并排序】:绝对是史上最全的归并排序分析,详细分析归并边界并给出算法可视化动图帮助你理解算法
排序问题可以说是最经典的算法问题了,一般一开始学的基础算法就是排序,排序既是算法的基础,也是考研数据结构的重要知识点。但是 C/C++ 都有现成的库函数(C里是 qsort、C++是sort),所以导致很多人就没有学排序算法本身,其实排序算法的思路非常有意思,从最简单的学起,对以后学习复杂算法是非常有帮助的,比如快速排序和快速选择之间的关系,归并排序和逆序对之间的关系。从今天开始,我们来试着掌握每个排序算法的思路,今天是归并排序,归并排序和快速排序有异曲同工之妙,等会娓娓道来。■蓝色的柱形。........原创 2022-08-05 15:33:49 · 129 阅读 · 0 评论 -
算法基础集训(第02天)------>【快速选择的三种方法】:曾经有同学在大厂面试的一道算法题目,想要解决题目不难,但是往往这种题目才需要优化
给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。(这是某大厂的算法面试题,要求手写)原创 2022-08-04 15:03:45 · 211 阅读 · 0 评论 -
算法基础集训(第01天)------>【快速排序】:绝对是史上最全的快速排序分析,分析了所有的边界情况并给出算法可视化动图帮助你理解算法
排序问题可以说是最经典的算法问题了,一般一开始学的基础算法就是排序,排序既是算法的基础,也是考研数据结构的重要知识点。但是 C/C++ 都有现成的库函数(C里是 qsort、C++是sort),所以导致很多人就没有学排序算法本身,其实排序算法的思路非常有意思,从最简单的学起,对以后学习复杂算法是非常有帮助的,比如快速排序和快速选择之间的关系,归并排序和逆序对之间的关系。从今天开始,我们来试着掌握每个排序算法的思路,今天是快速排序。...........................原创 2022-08-02 17:33:22 · 656 阅读 · 0 评论