![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
小鱼在乎
这个作者很懒,什么都没留下…
展开
-
二叉树---找树左下角的值
思路:层序遍历,遍历每层时记录最左边的节点值,直到遍历最后一层时可以得到树的最左下方节点的值。假设二叉树中至少有一个节点。原创 2024-07-19 13:35:38 · 75 阅读 · 0 评论 -
二叉树---左叶子之和
第三步:确定单层循环逻辑。判断以该节点的左孩子是否为叶子节点,若是,则左孩子的值也是结果的一部分。获取左子树的左叶子节点之和,获取右子树的左叶子节点之和,这三部分的和就是树的左叶子之和。左叶子:节点A的左孩子不为空,且左孩子的左右孩子都为空,那么A节点的左孩子为左叶子节点。第一步:确定参数与返回值。参数为树节点,返回值为int类型的左叶子之和。第二步:确定终止条件。如果节点为空则返回0,如果节点是叶子节点则返回0。题目:给定二叉树的根节点。原创 2024-07-19 12:47:12 · 81 阅读 · 0 评论 -
二叉树---二叉树的所有路径
第三步:确定单层递归逻辑。将节点加入List中,如果节点有左孩子,就对左孩子进行递归,再回溯;如果节点有右孩子,就对右孩子进行递归,再回溯。第一步:确定参数与返回值,参数为节点,存放路径的List,存放结果的结果集result,递归函数无返回值。第二步:确定结束条件。如果节点是叶子节点,存放路径的List中就存放了一整条路径,将其加入结果集。,返回所有从根节点到叶子节点的路径。使用前序遍历遍历整棵树。给你一个二叉树的根节点。是指没有子节点的节点。原创 2024-07-18 14:20:13 · 90 阅读 · 0 评论 -
二叉树 ---平衡二叉树
第三步:确定递归逻辑。分别求出其左右子树的高度,如果左子树或者右子树不是平衡二叉树,返回-1。然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。第二步:确定结束条件。当节点为空时,没有子树可以遍历,返回0,表示当前节点为根节点的树高度为0。第一步:确定参数与返回值。传入参数为节点,如果是平衡二叉树返回高度,否则返回-1.题目:给定一个二叉树,判断它是否是平衡二叉树。原创 2024-07-18 13:15:39 · 92 阅读 · 0 评论 -
二叉树---完全二叉树的节点个数
思路三:根据完全二叉树的性质。遍历节点的左侧深度和右侧深度,若两者相等,则说明以该节点为根节点的树是一个满二叉树,可以根据公式2^深度-1来计算树的节点个数。若不相等,则进行递归,总会找到一个满二叉树(叶子节点也是满二叉树),再向上返回。的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。,求出该树的节点个数。原创 2024-07-17 14:46:48 · 169 阅读 · 0 评论 -
二叉树---二叉树的最小深度
该题与求二叉树的最大深度还是有些不同的,需要增加一些判断,要注意左右子树不同时为空时并不是最低点,左右子树同时为空时才是最低点。叶子节点是指没有子节点的节点。注意最小深度的定义。给定一个二叉树,找出其最小深度。原创 2024-07-17 13:15:59 · 159 阅读 · 0 评论 -
二叉树---二叉树的最大深度
使用前序遍历或后序遍历,前序遍历求得树的最大深度,后序遍历求得节点的高度(根节点的高度就是树的最大深度)。本题解法使用前序遍历。每遍历一层,depth+1。是指从根节点到最远叶子节点的最长路径上的节点数。原创 2024-07-17 12:45:21 · 210 阅读 · 0 评论 -
二叉树---对称二叉树
思路:检查二叉树是否是对称二叉树,就是判断根节点的左右子树是否对称,也就是左子树翻转后是否与右子树一致。使用后序遍历,左子树用左右根的顺序遍历,右子树用右左根的顺序遍历,若二者遍历节点一致,则该树是对称二叉树,否则不是。比较二叉树外侧是否对称:传入左节点的左孩子,右节点的右孩子;比较二叉树里侧是否对称:传入左节点的右孩子,右节点的左孩子;左右节点同时不为空,节点数值不相同,不对称返回false;左右节点不同是为空,不对称返回false;左右节点同时为空,对称返回true;题目:给你一个二叉树的根节点。原创 2024-07-17 11:10:13 · 136 阅读 · 0 评论 -
二叉树---翻转二叉树(左右子树翻转,递归与迭代)
翻转这棵二叉树,并返回其根节点。题目:给你一棵二叉树的根节点。原创 2024-07-16 17:03:24 · 198 阅读 · 0 评论 -
二叉树---层序遍历(递归与迭代)
使用队列(先进先出)遍历树,队列中存储的节点是一层中的所有节点。初始入队节点root,出队,若左孩子,右孩子不为空,则入队它的左孩子,右孩子。(即逐层地,从左到右访问所有节点)。题目:给你二叉树的根节点。原创 2024-07-15 14:06:50 · 196 阅读 · 0 评论 -
二叉树---后序遍历(递归与迭代)
题目:给你一棵二叉树的根节点。原创 2024-07-14 13:03:21 · 216 阅读 · 0 评论 -
二叉树---中序遍历(递归与迭代)
题目:给定一个二叉树的根节点。原创 2024-07-13 14:45:12 · 124 阅读 · 0 评论 -
二叉树---前序遍历(递归和迭代)
若结点不为空,则弹出节点,入栈右结点,入栈左节点 ,入栈该节点,入栈空指针(根节点访问过但没有处理,加入空结点做标记);三部曲:确定递归函数输入参数,返回值;使用栈来进行遍历操作,前序遍历是中左右,将根节点压入栈,循环访问节点。若节点为空,将该节点弹出,取出栈顶元素加入结果集。题目:给你二叉树的根节点。原创 2024-07-12 14:36:37 · 179 阅读 · 0 评论 -
栈与队列---前k个高频元素
使用优先队列PriorityQueue构造一个k个元素的小顶堆,记录出现频率最高的前k个元素,小顶堆的根记录了优先队列的k个元素中出现频次最少的元素。若优先队列元素已为k个,且元素频次大于根元素频次,则弹出根元素,把该元素入队。最后优先队列中的顺序为出现频次递增的前K个高频元素。若用优先队列构造一个大顶堆实现,则需对map中的所有元素对进行排序,使用小顶堆只需要维护k个元素对,故大顶堆性能没有小顶堆好。思路:使用map记录nums数组中的元素以及对应出现的次数。题目:给你一个整数数组。原创 2024-07-12 13:01:44 · 124 阅读 · 0 评论 -
栈与队列---滑动窗口最大值
思路二:使用单调队列(单调递增或单调递减的队列)。滑动窗口的滑动过程与队列的操作类似,滑动窗口向前滑动一次,相当于队列pop一次,push一次。在本题实现中使用的是单调递减队列,队列里只维护有可能成为最大值的元素。思路一:暴力解法,使用for循环从下标0到nums.length-k,这是所有滑动窗口的左边界。for循环里再嵌套一个for循环遍历滑动窗口里的元素,找到最大值。这种方法的时间复杂度为k(n-k+1),在力扣运行超时。的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的。原创 2024-07-11 15:01:52 · 293 阅读 · 0 评论 -
栈与队列---逆波兰表达式求值
思路:用栈来解决该问题,遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。2.入栈的是数字,题目给的是String,需要用Integer.valurOf(s)进行转换。该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。1.这是String数组,符号判断条件要使用双引号。返回一个表示表达式值的整数。逆波兰表达式就是后缀表达式。原创 2024-07-10 10:26:40 · 232 阅读 · 0 评论 -
栈与队列---删除字符串中的所有相邻重复项
思路:遍历字符串s,使用栈来存储结果。如果栈不为空且栈顶元素与字符串元素相同,则弹出栈顶元素,否则该字符串元素入栈。由于元素出栈顺序与结果是逆序的,故遍历完成后使用StringBuilder中的reverse函数获得顺序结果。在完成所有重复项删除操作后返回最终的字符串。在 S 上反复执行重复项删除操作,直到无法继续删除。会选择两个相邻且相同的字母,并删除它们。给出由小写字母组成的字符串。原创 2024-07-10 09:55:29 · 186 阅读 · 0 评论 -
栈与队列---有效的括号
思路:这是栈的一种应用---括号匹配。遍历字符串s,若是左括号,则将相应的右括号压入栈;若是右括号,如果栈为空或者与栈顶元素不相同,则返回false,否则弹出栈顶元素。,判断字符串是否有效。原创 2024-07-09 10:19:46 · 100 阅读 · 0 评论 -
栈与队列---用队列实现栈
思路一:使用两个队列实现栈。队列是先入先出的,栈是后入先出的,所以要想队列的输出序列与栈的一致,队列的输入序列需要与栈的相逆。一个队列作为主队列,存放弹出顺序与栈的弹出顺序一致的序列。另一个队列作为辅助队列,压入元素时先在此排好序后再放入主队列。思路二:使用一个队列实现栈。要想实现先压入的元素后弹出 ,只需将队列先压入的size-1个元素弹出再压入。题目:请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(原创 2024-07-09 09:56:45 · 120 阅读 · 0 评论 -
栈与队列---用栈实现队列
Stack类有函数empty(),pop(),peek(),push(x),search(object)。请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(思路:需要用两个栈,一个作为输入栈,一个作为输出栈实现队列功能。原创 2024-07-08 13:41:57 · 89 阅读 · 0 评论 -
字符串---重复的子字符串
思路:KMP算法是处理一个字符串中是否有另一个子串问题的首选方法。获得字符串s的next数组,next[length-1]存储的是该字符串的最长相等前后缀的值。当一个字符串由重复子串组成的,最长相等前后缀不包含的子串就是最小重复子串,此时有s.length%(s.length-next[length-1])=0。所以当next[length-1]>0且length%(length-next[length-1])==0时,该字符串是重复的子字符串。,检查是否可以通过由它的一个子串重复多次构成。原创 2024-07-08 09:55:56 · 152 阅读 · 0 评论 -
字符串---找出字符串中第一个匹配的下标
思路一:暴力解法,时间复杂度为 O((n-m+1)*m),其中 n 是。字符串的第一个匹配项的下标(下标从 0 开始)。next数组就是一个前缀表,题目:给你两个字符串。原创 2024-07-07 11:32:07 · 205 阅读 · 0 评论 -
字符串---左旋转字符串(动态口令)
思路一:使用String的字符串切片函数substring(start,end),再用“+”连接,注意substring()参数左闭右开。思路二:使用Stringbuilder存储,进行遍历拼接。某公司门禁密码使用动态口令技术。请返回更新后的密码字符串。原创 2024-07-06 10:48:50 · 176 阅读 · 0 评论 -
字符串---路径加密
即无法直接修改字符串的某一位字符,需要新建一个字符串实现。用StringBuilder创建一个新的空间存储结果,遍历字符串,若为'.' 则将空格存入结果,否则将字符存入结果。现需将路径加密,加密方法为将。题目:假定一段路径记作字符串。中的分隔符替换为空格 "",请返回加密后的字符串。思路:在 Java 中,原创 2024-07-05 13:03:34 · 216 阅读 · 0 评论 -
字符串---反转字符串II
思路:重要的是找到要反转的部分的起始位置和终止位置。用一个for循环,每次循环跨越2K步,每次循环的i值就是反转的部分的起始位置,终止位置可以用Math.min(s.length-1,start+k-1)来表示,然后使用这两个指针进行反转字符串操作。(4)通过将给定字符与空字符串连接起来,将 char 转换为 java 中的字符串对象。(1)使用 String 类的 String.valueOf(char) 方法,可以将。(3)使用String str = new String(charArray)原创 2024-07-05 12:27:54 · 210 阅读 · 0 评论 -
字符串---反转字符串
使用双指针,left从数组头部开始遍历,right从数组尾部开始遍历,交换两个指针指向的元素,直至两指针重合。编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组。、使用 O(1) 的额外空间解决这一问题。不要给另外的数组分配额外的空间,你必须。原创 2024-07-04 10:59:16 · 120 阅读 · 0 评论 -
双指针---四数之和
注意不要忽略nums[a]>=0条件,例如target=-8,nums[a]=-4,num[b]=-3,nums[c]=-1,num[d]=0时依旧是答案。该题是在三数之和的基础上再加一层for循环,与三数之和不同的点在于,三数之和的target=0,而本题是任意的。故在对于返回空表时,条件不太一样。三数之和仅判断nums[a]>0即可,四数之和的判断条件为nums[a]>target&&思路:三数之和、四数之和、五数之和······都用双指针法解决。请你找出并返回满足下述全部条件且。原创 2024-07-04 10:26:17 · 105 阅读 · 0 评论 -
双指针---三数之和
对b去重,判断nums[left]与nums[left+1]是否相等,若相等则跳过nums[left+1]。如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。,判断是否存在三元组。原创 2024-07-03 14:37:58 · 169 阅读 · 0 评论 -
哈希表---赎金信
思路:将magazine中的字母及次数用map存储,key=字母,value=该字母出现的次数。遍历ransomNote中的字母,若该字母出现在map中且值不为0,则值-1,否则返回false。原创 2024-07-03 12:07:19 · 205 阅读 · 0 评论 -
哈希表---四数相加II
如果 0-(nums3[k]+nums4[l]) 在map中出现过的话,就用result把map中key对应的value也就是出现次数统计出来。key存nums1[i]和nums2[j]的元素之和,value存两数之和出现的次数。定义int变量result,用来统计。,请你计算有多少个元组。思路:定义一个map,遍历。= 0 出现的次数。原创 2024-07-02 12:21:16 · 141 阅读 · 0 评论 -
哈希表---两数之和
思路:哈希表中key存数组元素,value存它的下标。遍历数组,如果target-nums[i]存在于map中,则将返回i和map.get(target-nums[i]);若不存在,则将key=nums[i],value=i存入map中。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。整数,并返回它们的数组下标。你可以按任意顺序返回答案。,请你在该数组中找出。原创 2024-07-02 09:55:23 · 184 阅读 · 0 评论 -
哈希表---快乐数
思路:用set记录每一次的n值,每次循环判断n值,如果n不在set中,则加入set,更新n值;如果n在set中,则这个数不是快乐数;如果n=1,则这个数是快乐数。编写一个算法来判断一个数。原创 2024-07-01 14:30:55 · 185 阅读 · 0 评论 -
哈希表---两个数组的交集
扫描一遍nums1,把它的元素记录到set中(不记录重复元素)。扫描一遍nums2,若nums2的元素在set中则记录到result中,否则跳过。mapToInt():是 Stream API 提供的一个方法,它用于将流中的元素映射为整数类型。这种方式通常用于函数式接口的实现,特别是在使用 Stream API 进行流操作时,可以简洁地表示一个函数或者方法。(流)是Java 8引入的一个新的抽象概念,它使得可以以一种声明的方式处理数据集合。实现,该实现接受一个流中的元素,并返回一个。:这是一个函数式接口。原创 2024-07-01 14:08:32 · 218 阅读 · 0 评论 -
哈希表---有效的字母异位词
思路:使用哈希表记录s中每个字母出现的次数,再扫描t中的每个字母,若字母出现在哈希表key中,则减一;若不在key中或者value为0,则不是字母异位词。中每个字符出现的次数都相同,则称。,编写一个函数来判断。原创 2024-06-30 22:33:29 · 220 阅读 · 0 评论 -
链表---链表相交
思路:首先明确交点不是数值相等,而是指针相等。通过遍历获取两个链表的长度lenA,lenB,将较长的链表的起始指针移动到 |lenA-lenB| 的位置,这个操作等同于将两个链表的右端对齐。然后开始遍历剩下的结点,判断指针是否相等。,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回。,函数返回结果后,链表必须。整个链式结构中不存在环。给你两个单链表的头节点。原创 2024-06-28 15:47:56 · 133 阅读 · 0 评论 -
链表---删除链表的倒数第N个结点
思路:使用快慢指针,快指针先走n步,然后快慢指针一起走直到快指针指向最后一个结点,此时慢指针指向倒数第n+1个结点,再将该节点的next指向倒数第n-1个结点。题目:给你一个链表,删除链表的倒数第。个结点,并且返回链表的头结点。原创 2024-06-28 14:37:54 · 185 阅读 · 0 评论 -
链表---两两交换链表中的节点
题目:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。原创 2024-06-27 14:25:35 · 159 阅读 · 0 评论 -
链表---反转链表
思路一:使用双指针,cur指向要反转的结点,pre指向原链表中cur的前一个结点,将cur.next=pre即可反转。,请你反转链表,并返回反转后的链表。题目:给你单链表的头节点。原创 2024-06-27 13:23:47 · 183 阅读 · 0 评论 -
链表---移除链表元素
思路:创建一个带有虚拟头节点的链表list,用一个指针pre指向正在遍历的结点的前一个结点,用指针cur指向正在遍历的结点。若cur.val=val,则需删去此节点,只需要pre.next=cur.next即可。题目:给你一个链表的头节点。,请你删除链表中所有满足。原创 2024-06-26 12:37:49 · 90 阅读 · 0 评论 -
数组---有序数组的平方
思路:采用双指针,left指向nums第一个元素,right指向nums最后一个元素。对于最后的结果数组result,采用倒序填入。如果nums[left]的绝对值大于等于nums[right],则把nums[left]的平方填入result数组的最后一个元素位置,反之把nums[right]的平方填入result数组的最后一个元素位置。组成的新数组,要求也按。原创 2024-06-23 20:54:39 · 133 阅读 · 1 评论