题目描述 给定二叉树的根节点root,返回所有左叶子之和。 解题思路 这里我才用的是前序遍历,我们在遍历的时候因为是要手机左叶子节点,所以我们就不能等到遍历当前节点的时候再去做判断,应该遍历到一个节点的时候就对其下一个节点的左右子树进行判断,这样才能确保我们得到的是我们的左叶子节点 代码实例 classSolution{ intcount=0; publicintsumOfLeftLeaves(TreeNoderoot){ bianli(root); returncount; } publicvoidbianli(TreeNoderoot){ if(rootnull){ return; }...

  FHUfYd9S4EP5   7小时前   6   0   0 Java

题目描述 给定一个二叉树的根节点root,请找出该二叉树的最底层最左边节点的值。 假设二叉树中至少有一个节点。 解题思路 这道题用层次遍历的方式来说是比较简单的,用递归的话如果我们看别人的精简代码很难看出其中隐藏的细节,这里递归遍历其实我们用到了回溯的思想,我们直接采用前序遍历的方式(其实三种遍历方式都是一样的),定义一个max_depth作为参考值记录当前遍历子树的最大深度,如果我们遍历到了叶子节点而且其深度大于这个max_depth我们就可以进行赋值操作,反之则不用,因为深度没有它大的话肯定不是最后一层的叶子节点,没有我们上一次遍历子树的层次高,就无需进行赋值操作 代码实例 层次 impo...

  FHUfYd9S4EP5   7小时前   8   0   0 Java

题目描述 给你二叉树的根节点root和一个表示目标和的整数targetSum。判断该树中是否存在根节点到叶子节点的路径,这条路径上所有节点值相加等于目标和targetSum。如果存在,返回true;否则,返回false。叶子节点是指没有子节点的节点。 解题思路 我们这题采用任何一种遍历方式都是可以的,这题同样是有回溯的思想,如果不太懂的话可以去看看前面《求二叉树的左右路径》这一题,我们先去遍历左子树,遍历的时候如果节点的左右子树都为空说明我们已经到了叶子节点,此时我们就可以做判断了,看看是不是和我们的targetSum一致,如果不一致则它的父节点会产生回溯去遍历父节点的另一个子树,同样再去看看...

  FHUfYd9S4EP5   7小时前   6   0   0 Java

题目描述 给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。 解题思路 这道题我们采用二叉树里的前序遍历方式,我们要遍历所有到叶子节点的路径,我们采用复用的思想,就是让这里的几个数据结构我们可以重复使用,但是重复使用也就带来数据不一致的情况,我们用一个temp集合来存储遍历路上遇到的元素,但是这里的元素我们肯定是要变化的,你遍历了左叶子节点,那下次你遍历右叶子节点的时候你就要把左叶子节点的值给从我们这个temp集合中去除,所以这里就体现了回溯的思想,一层一层的往上回溯,直到最后回溯的只剩下了根节点,然后再同样的方法去遍历根节点的右子树。...

  FHUfYd9S4EP5   2天前   14   0   0 Java

题目描述 给你一个二叉树的根节点root,检查它是否轴对称。 解题思路 这里我们相当于是比较根节点左右两颗子树,我们依次向左右子树的左右两个方向进行遍历,我们比较左子树的左孩子和右子树的右孩子,左子树的右孩子和右子树的左孩子,这里如果不好理解可以看下面这个图片,如果两个子节点不为空且值相等我们就继续想下一层遍历,直至节点为空返回true,整个结果也就为true了。 代码实例 classSolution{ publicbooleanisSymmetric(TreeNoderoot){ if(root.leftnull&&root.rightnull){ returntrue; ...

  FHUfYd9S4EP5   10天前   25   0   0 Java

题目描述 给你二叉树的根节点root,返回其节点值的层序遍历。(即逐层地,从左到右访问所有节点)。 解题思路 这里我们层次遍历我们需要使用到队列这个数据结构,我们依次从根节点开始遍历,我们需要使用一个变量来记录此时我们队列中元素的数量,因为这样我们才知道这一层我们需要从队列中弹出多少个元素,弹出的元素我们加入到集合中,然后再把弹出元素的左右孩子节点依次添加到我们的队列中,当然这里我们还要判断遍历结束的条件--就是当我们这一层的所有元素都没有左右孩子节点就结束我们的遍历了 代码实例 classSolution{ publicList<List<Integer>>level...

  FHUfYd9S4EP5   18天前   45   0   0 Java

题目描述 给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。 返回滑动窗口中的最大值。 解题思路 这里我们可以自己设计个队列,这个队列里面主体数据结构我们使用Java里的Deque这个双向队列,我们向这个队列里放入元素的时候我们的原则是只维持队列里面最大的元素在我们这个双向队列的头部位置,当我们的滑动窗口向后滑动的时候,如果此时我们要弹出的元素不是队列的头部元素我们就直接跳过(说明在此前添加进来的时候就被pass掉了),如果我们此时要弹出的元素是队列的头部元素,我们就要把头部元素弹出,然后向后依次...

  FHUfYd9S4EP5   25天前   37   0   0 Java

题目描述 给出由小写字母组成的字符串S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。 在S上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 解题思路 这里我们还是使用栈这个数据结构,我们还是遍历当前字符串,如果栈此时为空我们则直接将遍历的字符放入栈中,然后继续遍历,当我们当前遍历的字符和栈顶的字符相等我们弹出栈顶元素,然后再继续遍历,如果遍历的元素和栈顶元素不同则直接入栈 代码 classSolution{ publicStringremoveDuplicates(Strings){ if(s.length()1){ retur...

  FHUfYd9S4EP5   27天前   51   0   0 Java

题目描述 给你一个字符串数组tokens,表示一个根据逆波兰式表示法表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 解题思路 我们依次遍历数据,如果遇到数字我们就直接入栈,如果遇到运算符,我们就取出栈顶的元素两个,然后进行运算,这里要注意-和/这两个运算符,取栈顶元素的位置要是运算时候的顺序是相反的,最后的话我们只需要返回栈里唯一的元素就行了,就是我们最终的结果 代码 publicintevalRPN(String[]tokens){ Map<String,Integer>map=newHashMap<>(); map.put("+",1); ma...

  FHUfYd9S4EP5   27天前   49   0   0 Java

题目描述 给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 每个右括号都有一个对应的相同类型的左括号。 大体思路 这里我们使用栈这个数据结构来解决,我们从左到右依次遍历,如果是左括号我们就添加一个对应的右括号进入到栈中,然后当我们遍历到右括号的时候我们需要比对当前栈顶元素是不是和当前遍历到的右括号一致,如果一致则弹出栈,如果不一致则说明此时闭合没按照顺序进行和我们的题目要求的不一致,如果我们遍历到栈为空,而此时我们还有括号元素没有遍历完,则说明此时没有左括号来和剩...

  FHUfYd9S4EP5   28天前   31   0   0 Java

题目描述 给定一个字符串s和一个整数k,从字符串开头算起,每计数至2k个字符,就反转这2k字符中的前k个字符。如果剩余字符少于k个,则将剩余字符全部反转。如果剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符保持原样。 解题思路 如果按照我们暴力解法的话我们肯定是想一个一个的for循环去遍历,其实这道题说了每次是以2k的进度往前跳跃的,我们可以每次以2k为单位向前移动,然后在做一些边界处理,整体代码不是很难理解,主要是要考虑好各种细节问题,这个你可以自己多尝试提交几次就可以不断的去完善 importjava.util.; classSolution{ publicStringreve...

  FHUfYd9S4EP5   2024年08月08日   55   0   0 Java

题目要求 给你一个由n个整数组成的数组nums,和一个目标值target。请你找出并返回满足下述全部条件且不重复的四元组[nums[a],nums[b],nums[c],nums[d]](若两个四元组元素一一对应,则认为两个四元组重复): 0<=a,b,c,d<na、b、c和d互不相同nums[a]+nums[b]+nums[c]+nums[d]target你可以按任意顺序返回答案。 这道题整体还是和三数之和的解法相似,只不过这现在是需要两层for循环了,有加了一个j作为内循环,内层循环里面还是采用双指针法:首先我们要对数组进行排序,我们开始遍历数组从0下标开始记为i,定义left...

  FHUfYd9S4EP5   2024年08月07日   51   0   0 Java

题目描述 给你一个整数数组nums,判断是否存在三元组[nums[i],nums[j],nums[k]]满足i!=j、i!=k且j!=k,同时还满足nums[i]+nums[j]+nums[k]0。请你返回所有和为0且不重复的三元组。 注意:答案中不可以包含重复的三元组。 双指针法:首先我们要对数组进行排序,我们开始遍历数组从0下标开始记为i,定义left指针为i+1,right指针为nums.length-1(最后一位),然后开始收集结果,如果我们的nums[i]+nums[left]+nums[right]<0则left指针右移一位,如果我们的nums[i]+nums[left]+n...

  FHUfYd9S4EP5   2024年08月07日   40   0   0 Java

使用数据结构Set 我们定义一个Set集合,先去遍历数组nums1,让其内部所有元素都存储到这个set集合中,然后再去遍历nums2,如果nums2中的元素在set集合中包含了,则说明这是两个数组都有的 importjava.util.; classSolution{ publicint[]intersection(int[]nums1,int[]nums2){ //if(nums1null||nums1.length0||nums2null||nums2.length0){ //returnnewint[0]; //} Set<Integer>set1=newHashSet&lt...

  FHUfYd9S4EP5   2024年08月07日   38   0   0 Java

题目要求 给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词。注意:若s和t中每个字符出现的次数都相同,则称s和t互为字母异位词。 由于字符在计算机内存中是以ASCII码或Unicode编码的形式存储的,我们可以得出'a'在ASCII表中的值是97,'A'为65,但其实这题你不必知道他们在ASCII中的具体值,你只需要知道他们在ASCII表中的值是连续的就行,这题你可以使用这种方法来编写代码,也可以使用我们比较传统的方法 ASCII法 importjava.util.; classSolution{ publicbooleanisAnagram(Strings,Stringt){ ...

  FHUfYd9S4EP5   2024年08月07日   32   0   0 Java
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~