![](https://img-blog.csdnimg.cn/20190927151053287.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
java算法学习笔记
文章平均质量分 69
作者本人在使用java做算法题时认为的比较经典和有用的题目笔记
Ares陌冄
准大四软件工程,对面向解决实际业务需求方面的内容感兴趣,励志深入学习java进大厂
展开
-
蓝桥杯第2198题——机房(LCA+dp)
我们修改原LCA中返回最近公共祖先,将其改为返回总链路长度,我们基于原LCA中对a和b节点的跳跃,在其中添加对于dp的访问,由于总链路长度是x个点的度数和,而我们只计算了其中的x-1条边的长度,那么最后在返回答案时添加一个最近公共祖先节点的度数即可。定义dp[i][j]表示从节点i开始向上跳2的j次方步所经过的距离:dp[i][j] = dp[i][j-1] + dp[st[i][j-1]][j-1]对于第二个询问, 从 3 到 4 需要经过 3,1,2,4 所以时间和为 1+2+2+1=6。原创 2024-05-25 10:36:47 · 328 阅读 · 0 评论 -
蓝桥杯第18481题——皇家守卫(单调栈+线段树)
对于第 𝑖 座塔,若其右边存在某座塔 𝑗,满足:max(ℎ𝑖,ℎ𝑖+1,ℎ𝑖+2,⋯,ℎ𝑗−1) < ℎ𝑗 则称第 𝑗 座塔为第 𝑖 座塔 "暸望塔"。这题的输入输出样例非常具有迷惑性,我们需要自行模拟两个瞭望塔各自高度不同的情况,A到B高度如样例一样单调递增的情况下,其公共瞭望塔的个数是B瞭望塔的个数;对于瞭望塔的定义,符合单调栈求解模板,即对于第i个塔,求其右边第一个比它高的塔,使用单调递减栈从后向前遍历,配合使用after数组记录栈内元素个数,即可得到瞭望塔个数。原创 2024-05-21 11:03:20 · 684 阅读 · 1 评论 -
蓝桥杯第18489题——拔苗助长(质数+map)
对质因数3来说,有一个x存在奇数个3。对于任意质因数p,任意两个数相乘的结果中p的个数为偶数,则说明两个数中的p的个数要么都是奇数,要么都是偶数;反过来说,如果存在任意两个数a和b,假设a的质因数2的个数为1个,那么b的质因数2的个数如果是偶数,则a和b相乘的结果必不可能是完全平方数。为了记录每一个x的每一个质因数的个数,我们可以使用Map数据结构,同时可以使用埃氏筛加快这个过程,我们筛选出log(N)以内所有质数逐一测试,如果在试除计算的最后没有变成1,则其本身就是一个质数,即自己的一个质因数。原创 2024-05-20 18:49:46 · 492 阅读 · 0 评论 -
蓝桥杯第2357题——限高杆(多层图+dijkstra)
最后,我们还要对不同层的同一个节点,即a1->a2、a2->a3、a1->a3的边权值置为0,因为有限高架的路径也可能非常不划算,这样设计就不必担心跨层必须要经过限高架的问题了,不经过限高架路段也可以免费跨层来到下层的结点。市长发现, 由于限高杆很多, 导致货车可能需要绕行才能往返于市场之间, 这使得货车在公路系统中的行驶路程变长, 增加了对公路系统的损耗, 增加了 能源的消耗, 同时还增加了环境污染。对于 50% 的评测样例, 2 ≤ 𝑛 ≤ 100,1 ≤ 𝑚 ≤ 1000,1 ≤ 𝑐 ≤ 1000。原创 2024-05-14 17:50:12 · 942 阅读 · 0 评论 -
蓝桥杯第246题——矩阵计数(位与集合+状压dp)
考虑到每一个格子的位置只有两种状态,以及题目数据规模较小,可以考虑到状态压缩dp思路,也可以通过位运算配合dfs排列组合进行验证。我们可以用位运算获得所有满足要求的行,即一行没有三个连续的1的所有情况,本题的关键也正是用位运算技巧代替X和O符号。定义dp[i][j][k]为,当前为第i行时,本行的合法状态为j,前一行的合法状态为k时的排列数。一个 N×M 的方格矩阵,每一个方格中包含一个字符 O 或者字符 X。输入一行包含两个整数 N,M (1≤N,M≤5)。输出一个整数代表答案。原创 2024-05-11 17:05:26 · 342 阅读 · 1 评论 -
蓝桥杯第17169题——兽之泪II(二分+前缀和)
这个方法错误的原因在于,对于一个较大的x,可能会有一个相当小的y,直白的说,帅怪的顺序可能是x1,x2,x5,y5,y5,y5……我们会考虑到遍历每组数据的所有x值,其比yi小的记录到cost里,但这种方式并不会超时,但是会有另外的问题:如果比yi小的x值数量已经满足n滴眼泪的要求,我们就需要提前返回最小的n个x值总和,如果是乱序的,每次从第一个x开始遍历,那么就无法找到不考虑y只考虑x的最小能量消耗情况(也就是只挑选部分怪兽打一次就够了的情况,无法计算出最小的x总和)在怪兽谷中,有 k 只怪兽。原创 2024-04-22 16:48:01 · 1126 阅读 · 0 评论 -
蓝桥杯第859题——旅行(最小生成树)
Z 小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光。Z 小镇附近共有 n 个景点(编号为 1,2,3,…,n),这些景点被 m 条道路连接着,所有道路都是双向的,两个景点之间可能有多条道路。也许是为了保护该地的旅游资源,Z 小镇有个奇怪的规定,就是对于一条给定的公路 ri,任何在该公路上行驶的车辆速度必须为 vi。速度变化太快使得游客们很不舒服,因此从一个景点前往另一个景点的时候,大家都希望选择行使过程中最大速度和最小速度的比尽可能小的路线,也就是所谓最舒适的路线。原创 2024-04-16 20:27:42 · 540 阅读 · 0 评论 -
蓝桥杯第2152题——红绿灯(线性dp)
, 达到瞬移的效果, 但是爱丽丝是遵纪守法的好市民, 在每个红绿灯前她都会停下氮气喷射, 即使是绿灯, 因为红绿灯处有斑马线, 而使用氮气喷射 装置通过斑马线是违法的。爱丽丝在最开始直接使用氮气喷射装置瞬间到达第一个红绿灯, 然后绿灯通过, 以最高速行进 60 秒后到达第二个红绿灯, 此时绿灯刚好变红, 于是她等 待 20 秒再次变为绿灯后通过该红绿灯, 此时氮气喷射装置冷却完毕, 爱丽丝再 次使用瞬间到达公司, 总共用时 80 秒。爱丽丝要开车去上班, 上班的路上有许多红绿灯, 这让爱丽丝很难过。原创 2024-04-12 16:40:36 · 719 阅读 · 0 评论 -
蓝桥杯第1121题——蓝桥公园
这是一道典型的floyd算法模版题,floyd算法相当暴力,时间复杂度O(n^3),适用于像这种只有小几百个点的情况,这种数据量我们不需要考虑其他算法,并且它可以一次计算出所有点到所有点的最短距离 ,对于多次查询的时间复杂度是O(1)。但是小明的体力有限,对于每个计划他想走最少的路完成,你可以帮帮他吗?如果要输出路径,则需要定义一个path数组,需要注意初始化的时候path[i][i] = i表示节点自己到自己的前置节点就是它自己,每连接一条边,都要将path数组做对应更新,最后使用dfs输出路径。原创 2024-04-05 16:23:36 · 322 阅读 · 0 评论 -
蓝桥杯第1593题——二进制问题
那么比111更大的数即代表着第一个数一定填1,在第二个区间中,我们是在第一个数填1的情况下,考虑第三个数不填1的排列数,即剩下1个位置填2个1满足要求——dp[1][2]。这样分的理由是,第一个数不填1,考虑剩下3个位置填3个1的方法总数,这不就正好是在000~111这个长度为3的二进制序列中填3个1的排列总数吗,即dp[3][3]。第三个区间考虑在第一个位置和第三个位置都填1的情况下,第四个位置不填1的情况,那么就要加上在剩下0个位置填1个1的组合数——dp[0][1]。输出一个整数表示答案。原创 2024-04-01 23:03:43 · 697 阅读 · 0 评论 -
蓝桥杯第131题——生命之树
上帝要在这棵树内选出一个非空节点集 S,使得对于 S 中的任意两个点 a,b,都存在一个点列 a,v1,v2,⋯,vk,b 使得这个点列中的每个点都是 S 里面的元素,且序列中相邻两个点间有一条边相连。题目说对于集合S中任意的两个点,都存在一条能连起来的路径,指的是S中所有的点都能在其中加上S中别的点连起来,其实就是寻找一颗权值最大的子树,千万。这是一道经典的树形dp,树形dp是结合dfs与递推计算的解题手法,用于在树和图的结构中进行递推计算,该题就是一个经典的应用场景。原创 2024-03-31 12:30:50 · 474 阅读 · 0 评论 -
统计数码出现的个数
上述算法基于[1, n]的数码数量,对于[n, m]之间的数码数量则可以先计算[1, m]和[1, n-1],再在对应数码位上进行相减即可。原创 2024-04-01 16:37:43 · 571 阅读 · 0 评论 -
蓝桥杯第642题——跳蚱蜢
在考虑单点bfs找最短路径的情况,我们可以想象原点是一颗由上至下的4叉树,那么题目的答案20,意味着我们要向下分出20层才能找到答案,树会不断往底部扩展,越是向下的层数,所需要计算的节点就越是多,如果我们没有去重,想象一个完整的20层4叉树,它是非常巨大的。所以我们考虑有哪些蚱蜢可以跳到空盘子上,进一步思考,就是空盘子可以与哪些蚱蜢交换位置,很明显,如图所示,0号空盘可以与2、1、8、7号蚱蜢交换位置,这就为我们提供了搜索路径的灵感;其中 8 只盘子内装着 8 只蚱蜢,有一个是空盘。原创 2024-03-18 16:13:47 · 1088 阅读 · 0 评论 -
蓝桥杯第1167题——荷马史诗
在这个地方我们尤其需要关注到一个细节,对于二叉树而言我们每次一定会选取两个节点不用担心这个问题,但对于k叉树,我们要尽量让叶子结点更靠近最终树的根结点,如果按照我们当前这样的设计由下至上的构建二叉树,就会让叶子结点聚到底端,使得每个单词所对应的k进制串都尽量的长,那么就违背题意和霍夫曼编码的初衷了。题目的描述很长,解释的有点过于多,但其实如果你是计算机专业的学生,知道霍夫曼编码,题目的内容就不难理解了,反之则不然,我仅在此处简单的对霍夫曼编码的关键部分进行讲述,具体内容读者可以去搜索相关资料。原创 2024-03-14 17:59:03 · 1082 阅读 · 0 评论 -
蓝桥杯第1595题——和与乘积
虽然我们可以考虑到使用大数类,但不妨我们考虑一下,如果满足要求的结果是区间积等于区间和,那么如果从某个时刻起,区间积已经比理论区间和的最大值还要大了,是不是就可以停下来了,那么不难发现,理论区间和最大值就是2e5 * 2e5。进一步思考,既然区间积的变化速度那么快,即便只有2,连续起来的增长速度也远超区间和的增长速度,而区间积的增长速度要想比区间和慢,使最终达到平衡,那就只有1这个值是满足要求的。符合条件的区间为 [1,1], [1,3], [2,2], [3,3], [3,4], [4,4]。原创 2024-03-12 12:16:59 · 1110 阅读 · 0 评论 -
蓝桥杯第1390题——A Careful Approach
对于测试一个t值是否满足要求,大的框架就是使用dfs,如果飞机没有降落,那么降落时间一定要在data[i][0]和data[i][1]之间,所以首先对理想中的最优降落时间——上一架飞机的降落时间+t,与目标飞机的最早降落时间取最大值,然后再与最晚降落时间取最小值。而本题还有一个坑点,就是关于单位的问题,首先它给的是分钟却要我们精确到秒,那我们当然是用秒来二分更好,因此我们首先将所有数据放大60倍变成秒,但这样做还是会导致通过率只有57.1%,原因是对于秒数量级还要进行四舍五入。输入的最后一行是一个零。原创 2024-03-04 20:42:21 · 622 阅读 · 0 评论 -
蓝桥杯第1374题——锻造兵器
蓝桥杯第1374题——锻造兵器,排序并利用双指针思想扩展为四指针原创 2024-02-22 12:37:33 · 621 阅读 · 0 评论 -
蓝桥杯第3513题——岛屿个数
解题思路全在代码注释中,本题作者使用bfs方式作答。原创 2023-11-03 23:10:53 · 516 阅读 · 1 评论 -
java正确销毁二叉树的方法
1.java与C/C++对于内存回收有着本质的区别,java是将对象引用置空来让垃圾回收器在适当的时候回收对象的内存空间,而C/C++则可以手动释放一个对象。2.java的按值传递使得对象的引用副本只能修改原对象中的内容,而做不到改变原引用的指向,这一点需要尤其注意。原创 2023-10-17 10:52:34 · 116 阅读 · 0 评论 -
对于Map类的内容一致性判断方法
今天在刷leetcode 242号题目的时候想到了使用Map类的特性,但尝试发现Map类并不能像集合类一样直接使用equals方法判断内容一致性,于是将该问题抛给了chatGPT,于是chatGPT给了我两种方式解决这个问题,由于第二种方法作者水平有限,故仅提供chatGPT的陈述。原创 2023-10-12 19:29:57 · 1055 阅读 · 0 评论 -
java打印本月日历
按照周一到周日为一行的顺序打印本月日期,并将当天的日期用"*"表示。此题意在加深学习者对于java日期类的综合理解。1.LocalDate类可以很方便的处理日期相关的计算,可以获取年月日星期等信息。2.获取年月日的方法的返回值均为int——getYear()、getMonthValue()、getDayOfMonth()。3.getDayOfWeek()方法返回的类型是DayOfWeek不是int,获取数值还需要再使用getValue()方法。4.可以使用minusDays()和plusDays()方法来对原创 2023-08-16 14:40:42 · 485 阅读 · 1 评论 -
java抽球游戏
现在有40个球序号分别为1至40,我们希望从中抽取6个不重复的球,并将其按从小到大的方式展示其序号。此题意在提升学习者对java数组的综合理解能力。1.对随机数生成,数组排序,数组输出测试这几个关键功能的进行了解和学习。2.对数组进行充分了解学习,灵活使用循环中的i下标,得到我们所需要的数据。3.可以对球的总数、抽取数量两个参数使用常量代替,提高程序的易修改性。4.可以通过异常处理的方式,控制球总数不及抽取数量的数组下标越界异常。原创 2023-08-15 11:54:30 · 90 阅读 · 0 评论 -
蓝桥杯第1457题——杨辉三角形
这道题的难点并不是什么高深的算法运用,而是重在优化和各方面的细节,对考生的综合素质要求极高,若能在考场高压环境下把握这道题的所有细节,想必你一定是比较资深的算法高手。原创 2023-07-31 22:42:37 · 954 阅读 · 2 评论 -
蓝桥杯第819题——递增序列
由于上述正常方法实在太容易因为细节而出错,因此给出以下"改进"后的方法原创 2023-07-30 12:48:24 · 51 阅读 · 1 评论 -
TreeSet的使用和“比较方法“的讨论
1.TreeSet类对集合中元素的排序,是基于类实现的Comparable接口中的compareTo方法,这里我们使用的Integer类已经实现了该方法,因此我们不必手动实现;(3).使用Comparable方法在待排序元素的排序策略仅为1种时可以让程序比较清晰,但程序中如果需要对该类进行多种策略排序时就会受到限制,这种情况就可以使用Comparator接口。(1).Comparable接口中的比较方法是compareTo,而Comparator接口中的比较方法是Compare。原创 2023-07-29 11:04:20 · 37 阅读 · 0 评论 -
蓝桥杯第505题——数字三角形
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。原创 2023-07-28 20:11:32 · 48 阅读 · 1 评论