自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 收藏
  • 关注

原创 算法讲解16:单调栈

当然除了在入栈时赋值给ans,也可以在出栈时处理,这就是第二种思路了,这里放上第一题的修改代码,只要把核心的for循环改过来就行了,下面是示范,不过i的下标改为1到n了,例题:输入n,和n个数,对这些数进行入栈出栈处理,保证大的数在前面,输出这些数在进行入栈时左边离他们最近的比他们大的数,如果没有就标记为-1。c.isEmpty() && a[c.peek()]<=a[i])//比如1 2 3 4 5,第二次的时候就是4<5,所以循环。// a[i]就是a[s.top()]的答案。

2025-12-26 17:49:39 796

原创 算法讲解15:栈

给出两个序列pushed和poped两个序列,其取值从1到n(n ≤ 100000)。已知入栈序列是pushed,如果出栈序列有可能是poped,则输出Yes,否则输出No。公式:卡特兰数:n个不同的元素按照某个顺序入栈,对应的合法的出栈顺序有几个?//确认栈顶元素,不干别的。

2025-12-25 18:31:08 605

原创 算法讲解14:链表相关问题讲解

但如果链表是有序的,我们仍然需要从前往后一个一个查找,这样显然很慢,这个时候我们可以使用跳表(Skip list),跳表就是多层链表,每一层链表都是有序的,最下面一层是原始链表,包含所有数据,从下往上节点个数逐渐减少。2. 分配一整片连续的内存空间,各个结点集中安置,逻辑结构上相邻的数据元素,存储在指定的一块内存空间中,数据元素只允许在这块内存空间中随机存放,这样的存储结构生成的链表称为静态链表。例题:给你但链表的头节点head,反转链表,并返回反转后的(这里的输入是无头结点的,如有则需要先去掉头节点)

2025-12-24 21:08:10 771

原创 算法讲解13:高精度乘除法

public static void ab(int x[])//处理输入的数组并在数组x[0]处中保留长度信息。if(x[i]<y[i])//因为前面必定大于后面,所以不用担心借位借不到,像减法那样最前面出负数。public static int cc(int x[],int y[])//检查是大除小还是小除大。public static void sub(int x[], int y[])//减法函数。

2025-12-23 20:15:14 746

原创 算法讲解12:高精度加减法

比如1234和12,正着推,s[0]=1,s[1]=2,s[2]=3,s[3]=4,a[0]=1,a[1]=2,如此对照下会出现千位对十位,百位对个位的情况。将123456存入数组s,s[0]=6,s[1]=5,以此类推,为什么要倒着推:方便对其位数。abc<acb //同位数,从前往后比,a=a,c>b,到此为止就能出答案。ab<abc //不同位数,两者前缀都是ab,那么abc多个c,右边大。ac>abc //前缀不同,a=a,c>b,左边大。//下一步取出所有前置的0。

2025-12-22 18:27:28 975

原创 算法讲解11:分治

(1)中心点左边的最大区间和:和原问题相同,递归。从中心点不断往左延申,同时记录最大值Imax 从中心点不断往右延申,同时记录最大值rmax 横跨中心点的最大区间和:Imax+rmax。1.暴力:枚举起点和终点,计算区间内的和,取最大值。转移方程:dp[i]=max(dp[i-1]+numsil,numsi))(3)横跨中心点的最大区间和:贪心求解---从中心点往左右两边延申。状态:dp[i]=X 代表以第i个元素结尾的和最大的区间,最大和是x。(2) 中心点右边的最大区间和:和原问题相同,递归。

2025-12-22 10:54:38 472

原创 算法讲解10:贪心算法

解释:这个例子中,第一只老鼠吃掉第 2 和 3 块奶酪(下标从 0 开始),第二只老鼠吃掉第 0 和 1 块奶酪。,比如n行m列的二维数组,选择各行的一个数,使各个数相加最大,这个题可以用贪心,但如果加上条件:各行的数必须不同列,那么因为是“当前的最优解”就不能用。输入:reward1 = [1,1,3,4],reward2 = [4,4,1,1],k = 2。输入:reward1 = [1,1],reward2 = [1,1],k = 2。- 如果第一只老鼠吃掉,则得分为 reward1[i]。

2025-12-21 14:53:56 461

原创 算法讲解9:搜索之dfs(深度优先)

具体来说,小 A 会从树上的某个结点出发,每一步可以移动到与当前结点相邻的结点,并且小 A 只会在偶数步(可以是零步)后结束漫步。现在小 A 想知道,对于树上的每个结点,从这个结点出发开始漫步,经过偶数步能结束漫步的结点有多少个(可以经过重复的节点)。// 染色数组:-1=未染色,0=颜色1,1=颜色2。// 3. 只处理未染色的节点(避免重复染色,和原BFS的color[v]==-1逻辑一致)// 4. 给相邻节点v染相反颜色(和原BFS的color[u]^1逻辑一致)// 0变1,1变0。

2025-12-21 11:55:14 1117

原创 算法讲解8:搜索之bfs(广度优先)

穷尽所有的可能找到最优解,或统计和法解的个数:dfs,bfs有多种优化方式,如减小状态空间,更改搜索顺序,剪枝等。

2025-12-20 18:03:06 1382

原创 算法讲解7:递归

在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。//1,把aa-1个都处理,这一行就是只处理一次,处理完后调用自身,就是持续调用aa-1次。if(aa==1)//这是减到底了,写这个if的目的是里面可以放return。那麽我们就知道一共需要做3个事情,设盘子数量aa,s起点,e终点,h媒介。输入:A = [2, 1, 0],B = [],C = []1.把x-1个盘子通过媒介传到柱子,s->e->h。3.把前面x-1个盘子移回正轨,h->s->e。

2025-12-20 16:14:37 606

原创 算法讲解6:快速幂

对于第一次m若为奇顺手补上m的1次方,对于最后一次则是把改变的m一次性乘给Return。//次方数4变2,2变1,直到n==0位置将n完全转化成相对分量的m。//次方数1变2,2变4,Return的初始值相当于m的0次方。我们在面对将一个数m乘以n次方的时候,一般都是直接暴力,比如n=5,m=6;直接上代码吧,输入是n,m,n代表乘的次方,m代表那个数,就是m的n次方。所以乘以的m必将是原版的,不会出问题。public class 快速幂 {package 博客;

2025-12-19 21:44:52 330

原创 算法讲解5:质数筛法

一般我们想确定一个数x是不是质数,直接暴力2到x-1,让x除以这些数,若有余数==0,就不是,但是这样还能优化:以12为例,我们去根号下12是3点多,再看12的因数,2,6 3,4 1,12 ---->找到规律了没有,所有因数(除了25有5*5这样),其他因数组合都在根号下12的左右,也就是说只需要for(int i=2;/*12要在i==6时用此循环与2相乘标记,依旧用2,3进入p,i=4举例,在这里4%2==0,2是4的因数。给8,12标为非质数,但是!

2025-12-19 19:03:01 1025

原创 算法讲解4:二分算法

因为快本质就是不断进行模拟,猜测是中间这个数,就算不行也是缩小了范围,可以看作是“有策略的枚举”,而非暴力当然这一串数必须是有序的因为二分是取一个范围嘛,所以我们要最大化最小值,最小化最大值,以下面这题为例,就是取最小0,最大是所有树最高的那个,要注意避免死循环,在必要情况下需要手推代码。

2025-12-17 10:54:36 697

原创 算法讲解3:尺取法

高效的枚举区间的方法,不会枚举到一定不满足条件的区间,不会枚举一定不是答案的区间,是一种利用双指针遍历获取满足条件的区间的方法,是一种线性算法,过程为:枚举r,l,r为不同终点,l为不同起点,,如此反复得到不同区间。while(l<=r&&sum-a[l]>=target){//在合法范围尽可能取最小。if(ans==Integer.MAX_VALUE){//都不行就返回0。while(r<=n-1)//重点在这,“就是一点点挪”public class 尺取法 {package 博客;

2025-12-14 18:14:48 243

原创 算法讲解2:前缀和,差分

为什么用:降低时间复杂度,优化代码特点:在计数类型的题使用,这里举一个简单的例子问:给定一个数组a[b],给出m个区间[i,r],对于每个区间,输出该区间中数据的和。如果不用前缀,我们就会想到先把左i都保存在i[m]中,把右r都保存在r[m]中j<m;q<=r[j];这样的话时间复杂度就会是m*(r[j]-i[j])如果使用前缀,就会思考到sum[i]=sum[i-1]+a[i];如此:int sum[b];i<b;

2025-12-14 11:37:11 767

原创 算法讲解1:枚举,模拟

为什么用:解诀常见“在一组数据中找到符合特征的数据”问题特点:简单,效率低个人理解:比如“寻找1到100中最大质数”我们从1遍历不如从100开始快,只统计1-50或51-100也不够全面,所以这里尽可能1顺序对2内容全,有些问题涉及搜索(bfs,dfs)(这里不展开说),像找到不同数组中有特定排列的这种例题演示。

2025-12-11 22:18:03 552 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除