zerorains的刷题记录
杂题记录
部分解题思路源自好友:therainisme
2021.4.25 dfs
判断是否为相同的树

解题思路:采用dfs,对这两棵树同时遍历,直到,这两棵树不同或完成为止
1 | /** |
货物摆放(暴力)

1 | import math |
毕竟是填空题,思路也是暴力,就是因数组合法,python永远滴神
结果为2430
Dijkstra求最短路径
题目描述:

解题思路:
变量定义:
1 | int g[a][b] 表示从a到b的距离 |
方法:
每次循环选择一个当前距离起点最近的点,被选择的点当前的距离起点的路径即为他的最短路径。
从该点出发,寻找下一个离起点最近的点直至所有的点都被更新完毕。
代码实现:
1 |
|
网络延迟问题
主要思想是floyd算法
问题描述:
有 n 个网络节点,标记为 1 到 n。
给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。
现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。
解题思路:
根据题目要求,即需要求出任意一个点到所有点的最短路径中的最大值,如果到不了全部的点就返回-1。
从这题上看,可以才用dijkstra算法和floyd算法,本次才用floyd解法,
floyd使用的图
1 | g[i][j] = c 表示从i到j的最短距离为c |
floyd核心思想就是对于一条路径a->b,长度为d1,是否存在一条路径a->c->b,长度为d2,使得d1>d2。
这里算法的时间复杂度为,空间复杂度为
AC代码:
1 | class Solution { |
链接所有点最小费用
最小生成树的应用,这里采用的是kruskal
题目描述:
给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。
连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。
请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单路径时,才认为所有点都已连接。
1 | 输入:points = [[0,0],[2,2],[3,10],[5,2],[7,0]] |
解题思路:
首先要给任意两点之间计算距离构造图,这个图是无向图
对所有边按照权值进行排序
每次取出一条边
使用并交集确认两个点是否能构成回路
如果不构成回路就作为生成树的一条边,并添加权值。
否则
就跳过
ps:效率有点拉跨,主要是为了熟悉kruskal这题力推Prime
AC代码:
1 | class Solution { |
small-k问题:选择第k小的数
1 |
|
计算有多少条直线(暴力)
问:x方向上有20个点,y方向上有21个点。即x是0到19之间的整数,y是0到20之间的整数。这些点一共确定了多少条不同的直线?
- 斜率和截距各不相同的线为不同的直线
- 有斜率不存在的情况
- 只要则默认其不同
- 答案:40257
实现代码
1 |
|
路径
一个图有2021个结点构成,依次编号1至2021。如果两个结点的绝对值之差大于21,则它们之间没有边相连。否则存在一条权值为它们最小公倍数的无向边。
现在问你,结点1和结点2021之间的最短路径长度是多少?
- 暴力floyd简单,就是算得久
- 答案:10266837
代码:
1 |
|
砝码称重问题

1 |
|
只出现一次的数字

这题简单的,我们都知道任意两个相同的数做异或都会变成0,而且与进行异或计算的位置无关,但是这个相同的数字出现的次数必须是偶数次,奇数次会出问题。
所以我们对所有的数字都进行异或操作就能找出孤儿的那个数字了。
1 | class Solution { |
不同的二叉搜索树(dfs)

才用dfs的思想,先找出任意一个节点下,左树的所有可能,和右树的所有可能,然后对左右子树进行结合生成二叉搜索树,然后选择下一个节点进行左右树的查找。
因为二叉搜索树左边小,右边大,可以利用类似与二分的思想划分左树和右树
AC代码:
1 | /** |
完全背包问题解法(动态规划)
题目简介:

和01背包问题的差别在于货物的使用次数是无限次,直接从代码讲解会轻松一些
给出最初的代码
1 |
|
对比一下
1 | dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i]]+W[i], dp[i-1][j-v[i]*2]+W[i]*2, ....) |
经过上面优化可以获得最终的代码为:
1 |
|
来一题蓝桥杯的奇怪题目(位运算)

其实是一个简单为运算,只用获取前8为的数据,前8位i为1的地方输出就行了,注意的是一行有两个字节,就是16位。
获取a的第i位数据的方法:cout<<((a>>i)&1)
正解代码
1 |
|
今天来一个DP题,数字三角形
解题思路
我们把这个三角形转化成输入样例的样子,我们就可以发现,这个三角形其实是可以使用一个二维数组进行存储的。
要求从第一层到最后一层的数值最大,那么我们dp表示就表示数字和最大,dp[i][j]表示到i,j这个位置的最大值为多少,当i = j = 1时,重量为w[1][1]
当前这个点的a最大值,可以由上方和左上方的数字得来,转化成递推方程就是
计算完dp之后,再遍历最后一行找出最大值就可以了
AC代码
1 |
|
石子合并问题
解题思路
在这题中,我们可以枚举这个区间的长度,然后在这个区间中寻找一个分位点,通过使用该点使得该区间合并的结果最小。
使用dp[l][r]表示合并l到r的区间最小的代价。我们可以将lr区间,分成,[l,k],[k+1,r],最后这两个区间的合并代价w应该为从l一直加到r的结果
于是我们有递推方程
AC代码
1 |
|
记忆化搜索——滑雪
解题思路
从题中可以看出,我们要从四个方向去寻找下一个可以i前进的方向,使其可以达到滑雪路径最长。这种描述是一种典型的搜索问题。因为要求最大值,通常是采用DFS,但是在这题下,如果采用DFS,过大的数据量很有可能会爆栈或超时,因此需要引入一个记忆化搜索矩阵dp[x][y],用于记录(x,y)这个点的最长滑雪路径,在我们到(x2,y,2)这个点时,只需要看一下,他四个方向可不可走,可走,就更新当前位置的值。
AC代码
1 |
|
杨辉三角(蓝桥)

1 |
|
错误票据(蓝桥)
找出断片和重复的两个数字即可,这个方法应该是
1 |
|
买不到的数目(蓝桥)
这个是一个结论题,题目解释一下给一个n和m,求出n和m在不同数量组合的情况下不能组合出来的最大数字
假设我们是4,6然后不管怎么组合都不可能组合出奇数,所以比不可能有这种情况,因为题目有解
所以这里用到的结论是
对任意互质的两个数字n和m,他们最大的,不能组合出来的数为
1 |
|
笨拙的手指
暴力枚举就行
1 |
|
干草堆
解法1:经典差分问题,但是要输出中间结果,那就排个序,时间复杂度大概,数据量不会超过差不多,可以这么解
1 |
|
研究生机试题
3683. 长方形中的正方形 - AcWing题库
暴力模拟
1 |
|
3684. a与b得到c - AcWing题库
暴力模拟
1 |
|
3685. 求众数 - AcWing题库
哈希表一存,遍历一遍,结束
1 |
|
3687. 骨牌 - AcWing题库
类似走楼梯,一次可以空出两个位置或者只空一个位置
1 |
|
3701. 非素数个数 - AcWing题库
这个考察两个知识点,质数筛和前缀和
1 |
|
3557. 分段函数 - AcWing题库
有手就行
1 |
|
3558. 整数和 - AcWing题库
1 |
|
3559. 围圈报数 - AcWing题库
我是笨蛋,这么简单,用个循环队列模拟不就行了,我还在想怎么用数组模拟哦,我是笨蛋
1 |
|
3560. 阶乘 - AcWing题库
有手就行
1 |
|
3562. 重载运算符 - AcWing题库
1 |
|
3563. 多项式的值 - AcWing题库
map模拟多项式好用的
1 |
|
3566. 复数加法 - AcWing题库
1 |
|
3567. 判断数字位置 - AcWing题库
1 |
|
3568. 整型存储 - AcWing题库
1 |
|
3569. 三角形相加 - AcWing题库
1 |
|
3570. 弹地小球 - AcWing题库
1 |
|
3571. 点的距离 - AcWing题库
1 |
|
3572. 直角三角形 - AcWing题库
1 |
|
3573. 日期累加 - AcWing题库
1 |
|
3575. 编排字符串 - AcWing题库
1 |
|
1 |
|
3581. 单词识别 - AcWing题库
1 |
|
3582. 身份证校验 - AcWing题库
1 |
|
994. 腐烂的橘子 - 力扣(LeetCode)
1 |
|
二分数据查找
Question: 显示出如下数组中的所有元素,并使用二分查找法在数组中查找元素。 int a[]={-90,-32,12,16,24,36,45,59,98,120}; 输入输出示例 -90 -32 12 16 24 36 45 59 98 120 请输入所要查找的元素:24 输出:第5个元素为24,比较次数为1 请输入所要查找的元素:120 输出:第10个元素,比较次数为4 请输入所要查找的元素:6 输出:查找失败 比较次数为3
1 |
|
通过二叉树的后序序列,与中序序列确定前序序列
1 |
|
求序列中回文串的最大长度,并输出其个数
1 |
|
通过字符串的层次接口,查找某个节点的父亲们
输入:
(aaa(bbb(ccc,ddd),eee(fff),ggg(h,i),j(k,l(m,n))))
n输出:
aaa>j>l>n
1 |
|
求广义表的深度
1 |
|
最小公倍数与最大公约数
1 |
|
统计一共英文句子中的所有单词,以及单词出现的次数,并将单词按照出现的次数从高到低进行输出
1 |
|
3721. 求30的倍数 - AcWing题库
满足两个条件,这个输入的数字中有一位是0,并且所有位的数字加起来的和可以被3整除即可
1 |
|
3722. 骑车路线 - AcWing题库
1 |
|
3723. 字符串查询 - AcWing题库
前缀和
1 |
|
3724. 街灯 - AcWing题库
差分
1 |
|
4269. 校庆 - AcWing题库
先用哈希表存储校友的身份证,然后在来宾中进行条件比较就行
1 |
|
1 |
|
1585. 校园内的汽车 - AcWing题库
1 |
|
1531. 课程学生列表 - AcWing题库
- 解法1:每个课程开一个小根堆,然后读取某个人的选课情况的时候,根据小根堆数组索引到对应的堆把名字存进去就行。
但是不加输入输出加速的话会TLE,建议直接使用printf
1 |
|
1523. 学生课程列表 - AcWing题库
1 |
|
1502. PAT 排名 - AcWing题库
1 |
|
前N个数字加和为D
输入一个正整数数字n和一个d,让你求出将d拆分成n个互不相同的正整数之和,总共有多少种拆分方法。交换顺序视为同一种解法
输入样例:10 2022
输出:379187662194355221
1 |
|









