自定义博客皮肤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)
  • 收藏
  • 关注

原创 算法学习笔记 2023/04/23

在遍历时目标值减去节点值,直到遍历到叶子节点或者值为负数,再判断遍历到叶子节点时是否为0;层序遍历,找到最后一层的第一个值。2. 遍历叶子节点的值等于目标值。1. 找到最左边的值。

2023-04-23 23:50:19 39

原创 算法学习笔记 2023/04/22

平衡二叉树,左右最大深度差不能为1,那就求最大深度差做对比。如果差的绝对值大于1,就返回-1终止递归,即不平衡。一个比较困惑的点在于所有路径的表现形式,重点在于如何把每一个叶子节点回溯到根节点。使用string回溯路径。左叶子指的是没有子节点的左 叶节点,求的是左子树左叶子节点和右子树右子节点之和。判断左子节点是否存在子节点,找到左叶子节点,然后对右子树用同样的方法,求和。1. 是否是平衡二叉树。2. 二叉树的所有路径。

2023-04-23 23:05:24 29

原创 算法学习笔记 2023/04/21

判例需要注意,左节点为空右节点不为空即返回到右节点递归,反之则是左节点,两节点都不为空,就取两者的min值。求左子树深度,和右子树深度,再比较最大值。也可以使用迭代法的层序遍历,最后一层即是最大深度。题目给的二叉树比较特殊,是一个完全二叉树,所以可以优化迭代的写法来降低复杂度;左和右遍历到底部,判断是否是满二叉树,若不是则返回去遍历下一层,直到遍历完元素。层序遍历的话,遍历到一个node左右节点都为空,即可返回depth。这个和上题原理类似,注意叶子节点为空才是最小深度。1. 二叉树的最大深度。

2023-04-22 00:41:38 30

原创 算法学习笔记 2023/04/19

二叉树的右视图,加上判断节点是否是右节点即可。每层遍历size次,则size-1处为每层最后一个元素。层计数的size在层序遍历中有很大作用。递归和迭代都可以解决这个问题,迭代在确定节点后交换左右节点。这里使用前序遍历,首先确定根节点再将子节点反转。例如:由下自上的层序遍历;加上求每层的和即可,注意题目的数据类型要求的是双浮点值类型。要考虑到所有不满足对称的情况,以及需要比较的对象。使用一个INT_MIN的值来标定每层的最大值。向右设置一个指针,本质还是在层中拉指针。今天学习的是二叉树层序遍历。

2023-04-20 01:05:34 31

原创 算法学习笔记 2023/04/18

写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。关键点在于遍历的对象,确保弹出NULL之后的节点一定是想要遍历的节点。

2023-04-18 18:55:08 22

原创 算法学习笔记 2024/04/17

这道题目需要使用小顶堆的结构,去存储前k个最大值,最大堆在更新时需要弹出最大值,反而无法存储前k大的值,而最小堆能弹出最小值来维护前k大的元素。对于索引的数据类型,本题中比较的是哈希map中nums[i]的频数,需要自定义比较类型。使用deque实现一个单调队列,使得进入的最大元素始终在队列顶,注意deque的语法,deque是一个双开口的队列,定义时要注意弹出的端口。这道题用O(n)的复杂度,应该使用队列。普通的队列可以实现区间的移动,但是要实现最大值的查找,还需要对队列元素的进入顺序进行调控。

2023-04-17 19:03:52 21

原创 算法学习笔记 2020/04/15

遍历字符串,遇到括号时将对应的反括号push入栈,如果遇到相同的字符,就pop出栈,如果左侧有多余字符,遍历后栈不为空,如果括号不匹配,遍历时栈顶会不等于遍历元素,如果右侧有多余字符,栈为空而字符串没有遍历完,找不到匹配的字符。栈的顺序很方便去做相邻元素的比较,随意弹出压入的性质也便于在字符串中做删除操作,遇到和栈顶相同的元素,就把栈顶一起弹出,相当于删除相邻元素的操作,这样对下一个元素来说,对比的栈顶即是原字符串中,删除元素后的前一个元素。逆波兰表达式就是后缀表达式,指的是把运算符放到末尾的算式。

2023-04-15 17:35:25 26

原创 算法学习笔记 2023/04/14

栈先进后出,如果创建一个顺序相反的栈,就可以做到先进先出,利用两个栈就可以模拟队列的作用。用两个队列来实现栈,一个队列存储除了最后一个元素之外的元素,然后队列再将最后一个元素弹出,再把元素送回队列。栈和队列在标准库中,不属于容器,而是容器适配器,他的底层容器是可以替换的,可以是数组,也可以是链表等。以上的操作也可以用一个队列实现,把队列中前面的元素弹出后插入队尾,再把最后一个元素弹出。队列先进先出,即使放入另一个队列也是先进先出,这样上一题的思路就不成立了。今天学习的内容是栈和队列相关的内容。

2023-04-14 23:04:21 20

原创 算法学习笔记 2023/04/13

计算前缀表的逻辑:推理了一下,j像是一个指针,跟随 i 延伸,当出现一个不存在于j 的延伸区间的字符,就要回退到直到出现这个字符的位置或是-1,回退需要多次进行,会是一个循环过程。用我的方式去理解,在文本串中搜索一个模式串,查找到一个不符合模式串的字符时,回退到模式串和当前匹配的长度。next数组的应用比实现简单,遍历文本串的同时遍历模式串,如果出现字符不等,回退到next数组的相应位置。用i,j代表模式串的后缀和前缀末尾,j不仅是前缀末尾,还是最大相同子串大小。前缀是指不包含最后一个字符的。

2023-04-14 01:31:24 44

原创 算法学习笔记 2023/04/12

考虑到字符串的性质,创建一个新字符串result,遍历的过程中给result加上字符串是s[i],s[i]是 ' ' 空格的情况下,加上'%'+'2'+'0',返回result字符串即可。不使用额外空间的方法,先把字符串全部翻转,再从头开始,把每一个单词翻转。使用双指针的方法,先计算需要给插入字符串让出的空间,再让两个指针同时从新旧字符串尾部位置向前遍历,不为空就赋值到新位置,遇到空值就向前赋值。字符串每遍历2k个字符反转前k个字符串,并且剩余不足2k的字符若大于k反转前k个字符串,小于k则全部反转。

2023-04-13 00:55:21 28

原创 算法学习笔记 2023/04/11

这道题中有很多地方要注意剪枝的取值范围,比如nums[i]的值和target之间的关系,以及nums[i]+nums[j]和target的关系,还有注意四个值之和有可能超出int的最大范围,需要转换为long格式。在一个数组中找到三个元素,他们的和为0,每个三元组不重复。重复的可能性有很多,需要在遍历过程中跳过相同的值,这就需要先对数组排序,对i个元素的查找需要从i+1开始。使用双指针法,同样事先排序好数组,将指针放在i+1的位置,若和大于零,则右指针左移,反之左指针右移。可以删除哈希表中指定位置的元素。

2023-04-12 03:30:09 26

原创 算法学习笔记 2023/04/10

如果使用哈希表,减去一个常数如果差值相等就放在一个表里,但这样又需要一个很长的哈希表。哈希表(hash table)是一种根据关键码值查找的表,也就是说,哈希表每个元素都有一个对应的索引,在存储时引入哈希表,在进行搜索查找时能降低复杂度。代码的实现,建长度为26的数组,然后使一个字符串每个值减去'a',差值所在的数组值++,然后对另一个数组进行同样操作,相反使用--,若数组每个值都为0,则两个字符串是异位词。在这道题中,哈希表起到的是记录循环得到的值的作用,用来判定什么时候退出循环,是查找值功能的变体。

2023-04-11 03:33:50 23

原创 算法学习笔记 2023/04/09

那么要检验一个链表是否是环形链表,我的思路是利用追逐的方式,慢指针移动一次时快指针移动两次,如果在某一时刻快指针和慢指针指向同一个节点,那么链表就是环形的。第一反应的解法是,对齐尾节点,从短的一条链表开始遍历找到第一个指向相同内存的节点。起点到相遇点的长度,是起点到相遇,再在循环体内循环一次的长度和的一半,快指针实际上多走了一个循环的长度,也就是说循环的长度等于起点到相遇点的长度,计算可得起点到交点的长度,等于相遇点到交点的长度。两两交换链表的节点,删除链表的倒数第n个节点,链表相交和环形链表。

2023-04-10 02:01:44 26 1

原创 算法学习笔记 2023/04/07

实际上反转链表只需要反转指针的方向就能实现。值得注意的是,反转指针始终是一个指向链表元素的空指针,所以当遍历完链表后可以直接return反转指针。链表的基本操作,有两种方法,其一是考虑是否删除头节点,在原链表上进行删除,另一种方法是定义一个指向头节点的虚拟头节点,再进行遍历删除,随后再将虚拟头节点指向的节点赋给头节点,这种方法不用考虑是否删除头节点。如何定义一个链表元素,首先定义一个节点的元素,然后使指针指向下一个节点,没有插入链表时指向NULL。今天学习的是链表相关的问题,移除链表,设计链表和反转链表。

2023-04-08 02:50:51 39 1

原创 算法学习笔记 2023/04/06

非递减排序指的是存在相等值的由小到大的排序,考虑负数的存在,只需要考虑头和尾元素绝对值的大小,在进行比较后将较大的值从尾到头,即正序从小到大的顺序赋给创建的数组copy,然后根据比较的结果移动指针。相当于对每一个可能的子数组终点 j,移动数组起点 i去寻找一个可能存在的最小子数组,但是相比暴力算法,子数组的起点和长度变成了数组终点的一个属性,从而降低了复杂度。暴力算法,将数组的每个元素的平方赋给原元素,再使用快速排序sort()函数,sort(nums.begain,nums.end)即可。

2023-04-07 00:14:51 37 1

原创 算法学习笔记 2023/04/05

② 注意定义的左右区间的开闭性,当定义Right = nums.size() - 1 时,nums[Right] 在数组中,取值区间为[Left , Right],而当定义Right = num.size() 时,nums[Right] 不在数组中,取值区间为[Left, Right),这种情况下,Left == Right 没有实际意义 ,因此写为 while(Left < Right)。① 关于数组的元素,数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。

2023-04-06 01:42:01 89 1

空空如也

空空如也

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

TA关注的人

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