- 博客(15)
- 收藏
- 关注
原创 12-15翻转二叉树的奇数层
根据完美二叉树的层次反转规则,即左边排第一的元素与倒数第一元素进行交换,第二个元素与倒数二个元素交换,此时root1 的左孩子与 root2 的右孩子可能需要进行交换,root1的右孩子与 root2 的左孩子可能需要进行交换。我们用 isOdd 来标记当前层次是否为奇数层,由于偶数层不需要进行交换,当 isOdd 为 true 时,表明当前需要交换,我们直接交换两个节点 root1,root2 的值;时间复杂度:O(n),遍历每一个节点,需要的时间为O(n)使用深度遍历,递归。
2023-12-15 18:48:08
74
1
原创 12-08滑动窗口
使用HashMap来记录当前遍历情况下的所有出现字母索引的最新情况,如果出现了一个字符在map中存在,判断这个字符的索引是否大于start,如果大于,说明是在当前的最大字符串中,所以从字符索引的下一字符重新开始,如果不在,则不管。但是可以发现,使用一个一个滑的滑动窗口会有很多无效循环,比如abcddfghj,d出现重复,但是在abcd中的最后一位,一位一位的滑,会导致b、c、d开始的滑动其实都无意义。技巧:用整数数组来存储字母,易于比较,不用考虑字母顺序。*将ch的索引值更新,保证它的索引为最新情况。
2023-12-11 09:22:35
72
1
原创 23-12-05 双指针 12-07dfs、差分数组、双指针
若nums[i]+nums[l]+nums[r]=0,将该组合添加到list,然后判断l的右边是否与l相等,若相等,则跳过,r的左边亦是,让l、r都跳到不相等的下一个数。自己的方法,使用了双指针,但是代码不优美,效率也不高,但话锋一转,虽然效率不高,但是自己做出困难题还是有成就感的。*若nums[i]+nums[l]+nums[r]<0,l++*若nums[i]+nums[l]+nums[r]>0,r--再判断该开头是否与前一个数相同,若相同,则跳过此次遍历,去重;*from<k<to,不管。
2023-12-07 16:58:19
90
1
原创 23-12-01
遍历arr[i],通过哈希表键值找到对应的下标,更新c1和c2。然后c1和c2来对应每行每列标记的个数。使用哈希表来将mat与下标i,j对应。
2023-12-01 22:27:23
68
1
原创 23-11-30
在做题过程中陷入了误区,光是想着要每次都一步到位,l要向右找到更大的和r向左找到更大的,然后比较,可以实现,而且及时找到了,也不一定是比开始的更大,也要与max进行比较,还不如简化问题,每次移动l、r中较短的。下述代码优雅和简洁。然后统计每个字符出现的个数,再比较两者的出现过的现有字符是否一样,如果不一样,返回false。如果一样,直接对统计的个数进行排序,若从小到大个数相等,则返回true。分为两个部分,使用小根堆+无穷的连续数,又因为小根堆无法去重,我们设置一个vis来保证不重复。
2023-11-30 16:05:32
50
原创 23-11-28
我采用了left.size()=right.size()||left.size()=right.size()+1。但其实在做的过程中,发现允许right比left大1会更简单,因为pushmiddle和popmiddle的时候,若不为正中,都取的中间两个靠前的数,所以允许后端的队列长更合理。比如:如果此时是left=right+1,pushmiddle,需要先把left尾巴给right在添加在left后面,而如果是right=left+1,可直接添加到left尾巴上。如果是首、中、尾,需要两个双端列表。
2023-11-29 22:53:42
58
1
原创 23-11-27
注意⚠️:在计算左边界或者右边界时将一侧设置为求解小于等于E的元素,目的是为了解决当一个子数组中有两个最小值元素时(比如[3,1,2,4,1]中有两个1),不重复且不遗漏地统计每一个子数组。——>如何确定个数,找左右边界left、right,贡献值为arr[i]*(i-left+1)(rgiht-i+1),将每个arr[i]的贡献值相加。利用单调栈向左找到第一个比A[i]小的数A[left](遍历顺序为0->n-1),也就是辐射范围的左边界;采用逆向思维,找每一个arr[i]作为最小值的子数组的个数。
2023-11-28 16:05:25
67
原创 23-11-25
思路:用dfs遍历树,用status表示数字状态(0为偶次,1为奇次),到叶节点时进行判断。status用来统计数字出现的奇偶次数(使用位运算)1、排序+查看连续(但是排序算法时间复杂度不满足)由题意可知,出现奇次的数至多只能有一个。HashSet,无重复元素。
2023-11-25 19:43:57
51
原创 23-11-23力扣(stringbuilder+)
StringBuffer是一种可变的字符串类,即在创建StringBuffer对象后,我们还可以随意修改字符串的内容。每个StringBuffer的类对象都能够存储指定容量的字符串,如果字符串的长度超过了StringBuffer对象的容量空间,则该对象的容量会自动扩大。每日一题:1410HTML实体解析器,containsKey和get用法。100题(1两数之和):创建一个哈希表,对于每一个。前者为不可变字符、后两者为可变字符。插入到哈希表中,即可保证不会让。,我们首先查询哈希表中是否存在。
2023-11-23 16:53:19
65
原创 2023.11.13-线段树
答案并不是,而且恰好相反,只有在我们遇到第 4 类问题,不得不写「线段树」的时候,我们才考虑线段树。多次将某个区间变成同一个数,求区间和:「线段树」、「树状数组」(看修改区间范围大小)这样看来,「线段树」能解决的问题是最多的,那我们是不是无论什么情况都写「线段树」呢?多次修改某个区间,求区间和:「线段树」、「树状数组」(看修改区间范围大小)多次修改某个数(单点),求区间和:「树状数组」、「线段树」数组不变,求区间和:「前缀和」、「树状数组」、「线段树」多次将某个区间变成同一个数,用「线段树」
2023-11-16 11:19:55
61
1
原创 burpsuite四种爆破形式
并且一般按照payload少的执行,如payload1设置10个,payload2设置9个,就执行9次。如果爆破点设置一个,payload设置10个,就执行10次;无论爆破点设置几个,payload1设置10个,payload2设置10个,就执行10次。同时爆破被§标志的爆破点,爆破点1指定payload1,爆破点2指定payload2,payload1设置10个,payload2设置9个,就执行10*9=90次。无论爆破点设置几个,payload设置10个,就执行10次。依次爆破被§标志的爆破点。
2023-09-04 19:16:26
1692
1
原创 数据结构 ——树
1.树的定义(大话数据结构p126~127)2.结点的分类结点拥有的子树数称为结点的度。度为0的结点称为叶节点或者终端节点;度不为0的结点称为非终端结点或分支结点(除根结点外,也称内部节点)。树的度时树内各节点的度的最大值。3.结点间的关系孩子,双亲,兄弟。祖先,子孙。4.数的其他相关概念树中结点的最大层次称为树的深度或者高度。树中结点的各子树看成从左到右是有次序的,不能互换的,叫做有序树,否则为无须树。森林是m棵互不相交的树的集合。5.树的存储结构(《大
2022-03-06 20:20:31
430
原创 数据结构 串——next数组、nextval数组
//朴素算法//s主串,t字串,pos初始为1//返回第pos个位置之后有字串,无则返回0int Index(String* s, String* t, int pos) { if (pos<1 || pos>s->length - t->length + 1) { printf("输入有误"); } int i = pos; //i用于主串的位置 int j = 0; //j用于子串的位置 while (i <= s->length &.
2022-03-05 21:16:50
1562
原创 数据结构线性表--链式存储(链表)
我在寒假尾巴决定大一下花多半个学期自学数据结构,买了《大话数据结构》,第三章线性表开始,我知道,从这时候开始我的博客吧,不早也不晚。希望能记录我的成长。线性表讲了通过数组实现的顺序存储,通过链表实现的链型存储,还有没有指针这个东西是使用的游标,一切显得有些奇妙。(其实现在c语言一点也不扎实,这期间还去把c prime plus中数组和指针及结构指针的部分看了)这篇博客,将记录我在本周二周三抽时间敲出的链表(计划中两天完成)第一步创建链表这是我的链表结构(这可以创建一个单项链表和循环链表,
2022-02-23 10:24:32
592
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人