- 博客(64)
- 收藏
- 关注
原创 二叉搜索树刷题
二叉搜索树的中序遍历结果就是一个递增的序列,只需要中序遍历,然后不断判断相邻节点的差是否是最小值。基于中序遍历的序列,直接获取第k个元素即可。
2024-07-12 21:50:54
168
原创 二叉树专题刷题
使用三个集合,sums集合存储每层的总和,count集合存储每层的节点数,averages存储每层的平均值。set方法:本质上是一种替换操作, 要设置某个位置上的元素,这个位置必须已存在,否则会抛出异常。add方法:用于向集合的末尾插入新的元素,是List接口中最常用的插入方法。使用depue双端队列,两端都可进。使用先进先出队列,每次都重置队列长度,使每次队列里都是每层的节点。我的思路相当暴力,只需要进行层序遍历,然后获取每层最右边的节点。这里要讲一下add方法和set方法的区别。
2024-07-12 20:58:48
237
原创 跳跃游戏Ⅱ-----题解报告
第一次跳跃时,最远跳到下标为2的位置,那么在2,3,1之间寻找能够跳跃的最远距离,不断更新,更新为4。与Ⅰ不同的是,这次要求找出最小的跳跃次数。思路也很简单,在每一次跳跃之后都更新最远的跳跃距离。第二次跳跃即从下标为1的位置开始跳跃,直接跳到终点终点。输入:2,3,1,1,4。
2023-10-22 18:55:53
318
原创 买股票的最佳时机Ⅲ------题解报告
我们来仔细分析一下题目,其实我们就是要寻找多个[l,r]的区间,让这些区间的prices[r]-prices[l]相加为最大值。但实际上,我们更具买股票的最佳时机Ⅰ可以很轻易的得知实际过程应该是第一天买进,最后一天卖出sum=5-1=4;那么对于每一个我们要寻找的区间的prices[r]-prices[l]来说,就等于相邻元素之差之和。根据我们上面的式子来说sum=2-1+3-2+4-3+5-4=4;我们创建一个dp的二维数组,用0表示手持现金,1表示手持股票。输入:1,2,3,4,5。
2023-10-20 13:46:13
82
原创 最佳买股票的时机------题解报告
时间复杂度为O(n),空间复杂度为O(1)写完之后看了一眼题解,发现没有更好的方法。一次循环,不断更新min和sum值。暴力双循环会时间超限。
2023-10-19 16:57:33
83
原创 轮转数组------题解报告
直接再创建一个数组,然后对应位置替换,最后把值赋给原来的nums数组。但是这种方法空间复杂度有些高了,只能说是大家都能想到的办法,还有没有更好的办法?输入:7 6 5 4 3 2 1(翻转后)输出:5 6 7 1 2 3 4。当然有,那就是翻转数组,首先我们来观察一下样例。输入:7 6 5 4 3 2 1(翻转后)输入:1 2 3 4 5 6 7。输出:5 6 7 1 2 3 4。输出:5 6 7 1 2 3 4。此时空间复杂度为O(1)
2023-10-19 14:32:41
71
原创 多数元素-----题解报告
这一题仔细阅读题目意思就会发现,主要就是找众数,并且题目中明确告知,给出的数组中必然有出现次数超过n/2的元素。那么我们就只要在遍历数组的时候,判断当前key值之和sum是否为0,为0则更新总数x;那就很简单了,有一个很偷懒的方法,对数组进行排序,那么第n/2个元素必然是众数。但是,有没有更快的方法?当然有,接下来就是本篇题解的重点------摩尔投票。不为0则判断当前元素和x是否相等,相等则sum++,反之则sum--;这个算法很好理解,首先我们要明确两个推论。数组遍历结束之和,返回x即可。
2023-10-18 08:48:24
75
原创 SpringBoot+SpringSecurity项目的创建
随便写一个controller类测试一下,你会发现不管你访问的是什么路径,security都会自动帮你跳转到登录界面。这是由于SrpingSecurity的强大功能,在控制台上输出的就是密码,默认username为user。首先创建一个springboot项目,注意springboot要求jdk版本在17以上。等项目构建完成之后,在pom文件中加入SpringSecurity的依赖。输入点击登录,就会进入你最开始输入的地址。
2023-10-17 17:29:11
160
原创 删除有序数组中的重复项Ⅱ--------题解报告
与Ⅰ不同的是这次题目要求,使得出现次数超过两次的元素只出现两次,所以我用了一个比较粗糙的双指针。同时使用变量r当作返回的数组长度,并且可以当作判断是否超出循环范围的依据,防止死循环。变量k去计数,作为判断是否要删除元素的依据;
2023-10-17 11:19:48
84
原创 删除有序数组的重复项-------题解报告
个人的想法比较粗糙,因为是递增数组,所以如果有相同的数组,必然相邻,所以只需要判断相邻元素是否相等,相等则将数组从相等处整体前移,同时让r--,当i>=r-1时,就说判断结束的时刻。如果相等,q 后移 1 位 如果不相等,将 q 位置的元素复制到 p+1 位置上,p 后移一位,q 后移 1 位 重复上述过程,直到 q 等于数组长度。首先让指针p都处在数组开头,q在p前面,然后让q++,再判断nums[p]和nums[q]是否相等,写完之后看了大佬的题解,发现用双指针,这题会更简单。
2023-10-16 22:00:11
98
原创 Servlet入门
当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径。Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。destroy方法在Servlet被销毁之前执行,一般用于释放资源。*每次访问Service方法时,service方法都会被调用一次。1.默认情况下,Servlet第一次被访问,就创建。只有服务器正常关闭时,才会执行destroy方法。3.被销毁:执行destroy方法,只执行一次。1.被创建:执行init方法,只执行一次。
2023-10-16 20:13:08
439
原创 解决java.lang.IllegalArgumentException: servlet映射中的<url pattern>[demo1]无效
java.lang.IllegalArgumentException: servlet映射中的[demo1]无效。显示路径错误,于是去检查Web.xml中的配置,发现是配置文件的路径写错了,少写了一个/
2023-10-16 18:37:25
288
原创 移除元素题解
题解:这题重点在于思绪变通,用变量l去找数组的长度。for循环遍历nums数组,当nums[i]不为val时,将nums[i]放在l之前的数组中,确保l前的数组中不存在val。
2023-10-16 17:01:18
82
原创 奖励最顶尖的k位学生------题解
题解:使用Set集合存储正面和负面反馈,加快查找速率。首先先分割字符串,然后查找是否包含对应的正负面反馈,然后算出得分,最后对map集合排序,找出前k名顶尖学生。
2023-10-11 16:55:34
60
原创 暴力枚举题单--题解报告
题目一统计方形(数据加强版) - 洛谷解题思路关键在于得出公式 (n-i)*(m-j)代码展示#include<stdio.h>long long n,m,i,j;long long sum,num;int main(){ scanf("%lld %lld",&n,&m); for(i=0;i<n;i++) { for(j=0;j<m;j++) { if(i=
2022-03-19 10:57:20
634
原创 后缀表达式--题解报告
题目后缀表达式 - 洛谷解题思路后缀表达式,就是没有括号,运算符号放在两个运算对象之后,所有计算按运算符号出现的顺序,严格地由左而右新进行(不用考虑运算符的优先级)。例如3+4的后缀表达式是34+。这里很适合用栈来做。以示例来说明:3.5.2.-*7.+@首先将数字入栈,当遇到‘-’时,将5和2出栈,计算5-2=3;遇到‘*’时,计算3*3-9;再将7入栈,遇到‘+’时,计算9+7=16.要注意,直到遇到'.'数字才可以入栈,我好几次就因为这个//错误的代码if(a&g
2022-03-17 22:08:59
505
原创 采草药---题解报告
题目疯狂的采药 - 洛谷解题思路完全背包问题,和之前做的题目不一样的就是,每个草药可以无限采。代码展示#include<bits/stdc++.h>using namespace std;long long n,m;long long t[1000001],v[100001],dp[10000001];//数组一定要开到足够大int main(){ scanf("%lld %lld",&n,&m); for(int i=1;i<
2022-03-07 20:26:28
405
原创 拼数---题解报告
题目[NOIP1998 提高组] 拼数 - 洛谷解题思路每次写题,涉及到字符串,我就想感叹一次c++对写字符串的题目简直太友好了。这题只需要修改一下排序的条件,判断一下两个谁在前面让字符串更大,小的时候就交换代码展示#include<bits/stdc++.h>using namespace std;int n;string str[30];bool cmp(string a,string b)//这是重点{ return a+b>b+a;}
2022-03-07 20:20:38
526
原创 《大话数据结构》第七章--学习笔记
图的定义图是由顶点的有穷非空集合和顶点之间边的集合组成的,通常表示为G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。注意:1.线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点。2.图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的。各种图的定义无向边:若顶点vi到vj之间的边没有方向,则称这条边为无向边,用无序偶对(vi,vj)来表示。有向边:若从顶点vi到vj之间的边有方向,则称这
2022-02-17 22:28:38
399
原创 最小生成树--学习笔记
我们把构造连通图的最小代价称为最小生成树。KrusKal算法既然要求是边的总长度最短,那我们先把所有的边按照权值从小到大排序,再按照边的权值从小到大去选,直到选择了n-1条边,让整个图连通。我们可以利用并查集,将所有的顶点放在一个并查集中,判断两个顶点是否连通,只需判断两个顶点是否在同一个集合(即是否有共同的祖先)即可。算法思路:首先按照边的权值进行从小到大排序,每次从剩余的边中选择权值较小,且边的两个顶点不在同一个集合内的边(就是不会产生回路的边),加入到生成树中,直到..
2022-02-16 23:25:19
470
原创 hash--学习笔记
存储位置=f(关键字)那样我们可以通过查找关键字不需要比较 就可获得需要记录的存储位置。这就是一种新的存储技术--散列技术。散列技术是再记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key)。我们把这种对应关系f称为称为散列函数,又称为哈希函数。采用散列技术将记录,存储在一块连续的存储空间称为散列表或哈希表。哈希表的长度一定要为质数,因为要让其分布均匀。哈希表的缺点,表越满,性能越差,越容易发生冲突,增加计算次数。如果哈希表满了,.
2022-02-15 00:07:57
181
原创 KMP模式匹配算法
kmp模式匹配算法,可以大大避免重复遍历的情况。kmp模式匹配算法原理如果主串为S=“abcdefgab",子串为T="abcdex"。如果用朴素算法,那么匹配过程应该是按照朴素模式匹配算法,匹配如上图。如果我们知道T串中首字符”a“与T中后面的字符均不相等,那么上图中2,3,4,5步骤都可以省略。只保留1,6步骤即可。...
2022-02-13 19:33:47
629
原创 《大话数据结构》第五章学习笔记----串
串串是由零个或多个字符组成的有限序列,又叫字符串。串的定义一般记为s=“a1aa2a3...an"(n>=0),其中s是串的名称,括起来的字符序列就是串的值。串中的字符数目n称为串的长度,n是一个有限的数值。零个字符的串称为空串,可以直接用””表示。空格串,是只包含空格的串。注意它和空串的区别,空格串是有内容有长度的,而且不止一个空格。子串与主串,串中任意个数的连续字符组成的子序列称为改串的子串,相应地,包含主串的串称为主串。子串在主串中的位置就是子串的第一个字符在
2022-02-11 23:21:49
529
原创 《大话数据结构》第四章学习总结(一)
队列队列的定义队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表队列是一种先进先出的线性表。允许插入的一端称为队尾,允许删除的一端为对头。循环队列队列顺序存储的不足实现顺序存储需要建立一个数组,所谓入队操作,其实就是在队尾追加一个元素;出队操作,就是让所有的元素向前移动,保证队列的对头,即下标为0的位置不为空。由于出队时要移动所有的元素,为提高出队的性能,我们可以让对头不需要一定在下标为0的位置。为了避免当一个元素的时候,对头和队尾重合使处...
2022-02-09 22:27:11
139
原创 《大话数据结构》第四章学习笔记(一)
栈栈的定义(后进先出)定义栈是限定仅在表尾进行插入的删除操作的线性表我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何 数据元素的栈称为空栈。栈又称为后进先出的线性表,简称LIFO结构。注意:栈是一个线性表,也就是说栈元素具有线性关系,即前驱后继关系。栈的特殊之处在于限制了这个线性表的插入和删除位置,它始终在栈顶进行。这也就使得:栈底是固定的,最先进栈的只能在栈底。栈的插入操作,叫作进栈,也称压栈、入栈。栈的删除操作,叫作出栈.
2022-02-08 23:57:58
796
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人