算法学习
文章平均质量分 93
晚•夜
这个作者很懒,什么都没留下…
展开
-
二叉树-03
空间复杂度:O(h),其中 h 为树的高度,递归调用的时候会占用栈空间,最坏情况下与树的高度相关。空间复杂度:O(h),其中 h 为树的高度,递归调用的时候会占用栈空间,最坏情况下栈空间的使用与树的高度相关。时间复杂度:O(n),其中 n 为树的节点数,因为在最坏情况下,需要遍历两棵树的所有节点进行比较。时间复杂度:O(n),其中 n 为树的节点数,因为在最坏情况下,需要遍历两棵树的所有节点进行比较。空间复杂度:O(h),其中 h 为树的高度,递归调用的时候会占用栈空间,最坏情况下与树的高度相关。原创 2024-03-01 23:20:09 · 931 阅读 · 1 评论 -
二叉树-02
此时,路径的数目为 O(N),并且每一条路径的节点个数也为 O(N),因此要将这些路径全部添加进答案中,时间复杂度为 O(N。空间复杂度主要取决于递归调用的栈空间,递归栈的深度等于二叉树的高度,最坏情况下,二叉树的高度等于节点个数,空间复杂度为O(n)。空间复杂度主要取决于哈希表和队列空间的开销,哈希表需要存储除根节点外的每个节点的父节点,队列中的元素个数不会超过树的节点数。由于我们使用递归来实现深度优先遍历,因此空间复杂度的消耗主要在栈空间,取决于二叉树的高度,最坏情况下二叉树的高度为 O(n)。原创 2024-02-23 22:16:32 · 827 阅读 · 0 评论 -
二叉树-01
空间复杂度主要取决于递归时栈空间的开销,最坏情况下,树呈现链状,空间复杂度为 O(N)。平均情况下树的高度与节点数的对数正相关,空间复杂度为 O(logN)。空间复杂度主要取决于递归时栈空间的开销,最坏情况下,树呈现链状,空间复杂度为 O(N)。平均情况下树的高度与节点数的对数正相关,空间复杂度为 O(logN)。空间复杂度:O(N),其中 N 是树的节点数。空间复杂度:O(N),其中 N 是树的节点数。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。对每个节点访问一次。原创 2024-02-22 23:38:03 · 670 阅读 · 0 评论 -
链表-04
时间复杂度:O(N),其中 N 是链表的长度。通过上述两个步骤,我们实际上达到了删除指定节点的目的,因为我们将指定节点的值和指针都修改成了它后面节点的值和指针,从而绕过了指定节点,实现了删除操作。这个问题的关键在于我们无法访问要删除的节点的前一个节点,但我们可以将要删除节点的值替换为它后面节点的值,然后删除它后面的节点。给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字。链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。原创 2024-02-21 11:33:31 · 843 阅读 · 0 评论 -
链表-03
使用快慢指针的方法,其中一个指针每次移动两步,另一个指针每次移动一步,当快指针到达链表末尾时,慢指针会指向链表的中间节点。接下来,重新定义一个指针 head,指向链表的头节点。然后,通过一个循环,让 head 指针和 slow 指针以相同的速度向前移动,当它们再次相遇时,即为环的入口节点。具体做法是,遍历原始链表的前半部分和反转后的链表,并依次交替连接节点,直至完成链表的重排。整体思路是先找到中间节点,然后将链表分成两部分,反转后半部分链表,最后合并前半部分和反转后的后半部分链表,实现链表的重排操作。原创 2024-02-21 09:52:29 · 779 阅读 · 0 评论 -
链表 -02
开始反转操作:遍历需要反转的区间(共 right - left + 1 个节点),每次将当前节点指向前一个节点,更新 pre、curr 和 nxt 指针。反转完成后,调整指针连接关系:将反转部分的尾节点的 next 指针指向下一个待反转区间的头结点,将 p0 的 next 指针指向反转部分的头节点。反转完成后,调整指针连接关系:将反转部分的头结点的 next 指针指向未反转部分的头结点,将 p0 的 next 指针指向反转部分的尾节点。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。原创 2024-02-19 17:01:54 · 1099 阅读 · 0 评论 -
链表-01
这种方法利用了迭代的特性,每次将当前节点的下一个节点保存起来,然后将当前节点的 next 指针指向前面已经翻转好的链表,最后将 prev 和 curr 指针向后移动,直到遍历完整个链表。例如,原始链表为 1->2->3->4->5,翻转后的链表为 5->4->3->2->1。这种方法利用了递归的特性,每次都选择较小节点进行合并,直到一个链表为空,然后将另一个非空链表直接连接到已合并的链表的末尾。这种方法利用了链表的特性,顺序处理两个链表对应位置的数字,并考虑进位的情况,最终得到表示两数相加结果的新链表。原创 2024-02-18 23:58:42 · 1000 阅读 · 0 评论 -
二分算法02
假设有一个长度为 n 的数组 candies,表示每个糖果的数量。我们需要找到一个最大的正整数 x,使得将每个糖果分成 x 份后,每个孩子都可以得到至少一份,并且可以得到最大总糖果数。另给你一个长度为 n 的整数数组 dist ,其中 dist[i] 表示第 i 趟列车的行驶距离(单位是千米)。假设有一个长度为 n 的数组 dist,表示一系列区间的距离,以及一个代表旅行所需总时间的浮点数 hour。另给你一个整数 k。这种方法利用了二分查找的特性,不断缩小搜索范围,最终得到符合要求的最大的正整数 x。原创 2024-02-18 23:58:20 · 1131 阅读 · 1 评论 -
素数算法(普通求解,埃氏筛,欧拉筛)
如果遍历完所有可能的因数,都没有找到可以整除n的数,则n是素数,返回True。然后,我们遍历2到n的每个数i,在遍历过程中利用已知的素数列表primes来标记每个数的最小质因数。具体来说,对于一个待判断的数n,我们可以从2开始依次尝试将n除以小于等于n的开方的所有数,如果存在一个因子能够整除n,则n不是素数;因此,通过遍历素数的倍数并将其标记为非素数,我们可以排除一大批非素数,从而筛选出素数。遍历素数列表primes中的每个素数p,如果i * p <= n,将is_prime[i * p]置为False。原创 2024-02-16 22:30:53 · 941 阅读 · 1 评论 -
从0开始刷算法题(leetcode数组篇)-- day04
我们从后往前遍历,当出现nums[i]<nums[i+1]时,nums[i]即为较小数,而此时nums[i+1]以及它以后的数字都是降序排序的,接下来我们再从后往前遍历,找到第一个nums[j]>nums[i],此时nums[j]即为较大数,此时直接交换nums[i]和nums[j],由于nums[i+1]之后的数字都是降序的,因此我们直接通过双指针交换首尾的值,即可实现降序操作。而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。原创 2023-12-06 15:21:06 · 6048 阅读 · 1 评论 -
从0开始刷算法题(leetcode数组篇)-- day03
思路:我们初始化最后一个数字的下标为end,那么如果在跳跃的过程中如何出现当前位置能跳的最远距离比end远,是不是就意味着可以到达最后一个下标了,这个的主要解题方法就是在跳跃的过程中记录当前位置所能跳跃的最远距离,之后与之前记录的最大值比较,取两者中的最大值,然后只要出现大于等于end的情况就返回True,如果在跳跃的过程发现能跳的最远的距离小于等于当前的下标的话,就返回False。优化一:我们的数组是已经排好序的,因此当nums[i]+nums[i+1]+nums[i+2]都大于0时,可以直接跳出。原创 2023-12-05 09:42:54 · 7861 阅读 · 0 评论 -
从0开始刷算法题(leetcode数组篇)-- day02
思路:初始化当前表示连续字符的数量cnt为1,然后从第二个字符(下标为1的字符)开始遍历字符串,如果遇到与上一个字符相同的字符则将cnt加1,否则重置cnt为1,同时与之前存的最大连续字符数量进行比较一下就可以了。注意,我们在最后循环结束后也需要判断一次插入空间是否被插入,因为如果循环的最后一个区间也与插入区间有并集的话,不进行判断就会导致少插一个区间。空间复杂度:除了用于输出的空间以外,额外使用的空间为常数,因此空间复杂度是O(1)的。空间复杂度:只使用了额外的两个变量,因此空间复杂度为O(1).原创 2023-12-01 14:38:15 · 9034 阅读 · 1 评论 -
从0开始刷算法题(leetcode数组篇)-- day01
数组(Array)是有序的元素序列。若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按有序的形式组织起来的一种形式。这些有序排列的同类数据元素的集合称为数组。原创 2023-11-30 09:22:17 · 9856 阅读 · 0 评论