- 博客(24)
- 收藏
- 关注
原创 【LeetCode刷题记录】简单篇-111-二叉树的最小深度
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。首先,如果传入递归的节点root为空,那么肯定直接return 0,这是没有疑问的。仔细分析上述例子的情况,我们可以容易的发现一种特殊情况,当一个节点root的左子树为空时,这个节点的深度就等于其右子树的深度+1,同理,当该节点的右子树为空时,这个节点的深度就等于其左子树的深度+1。这时我们考虑完全了吗?没有。还有一种更特殊的情况是,左右子树均为空,即该节点是叶子节点,这时应该r
2024-05-11 18:49:37 473
原创 【LeetCode刷题记录】简单篇-110-平衡二叉树
给定一个二叉树,判断它是否是平衡二叉树 。左右子树的深度之差不超过1则称该树为平衡二叉树。在这道题中,首先,空树一定是平衡二叉树,单独处理。然后,对于非空树,需要判断其左右子树的深度,这里仍然使用递归的思想,用一个countHigh函数来计算深度,通过传入root->left和root->right来分别计算左右子树的深度left和right,如果left和right等于-1,则表示树失衡,返回-1,否则返回left和right中较大的一个值+1(+1是因为这里返回是返回给上层递归,加的1表示上一层)
2024-05-09 18:43:29 552
原创 【LeetCode刷题记录】简单篇-108-将有序数组转换为二叉搜索树
给你一个整数数组nums,其中元素已经按升序排列,请你将其转换为一棵平衡 二叉搜索树。平衡二叉搜索树(BST)的特点是中序遍历的结果是一个递增的序列。换句话说,它的根节点的左子树的节点值全部小于根节点,根节点的右子树的节点值全部大于根节点(这棵树的所有节点都可以作为这里说的根节点)。本题给定了一个升序序列,要转换为BST,根据上面说的特点,这个序列的中间元素就是这棵树的根节点,以这个中间元素为间隔,其左边的元素就是这棵树的左子树节点,其右边的元素就是这棵树的右子树节点,以此递归下去,在左边的
2024-05-08 12:29:17 681
原创 【LeetCode刷题记录】简单篇-104-二叉树的最大深度
给定一个二叉树root,返回其最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。从根节点到最远的叶子节点的长度,只有两种情况,左子树最长或者右子树最长。所以很明显就要把左子树和右子树分开递归,然后取最长的那一个就是该树的最大深度。代码逻辑也很简单,如果传入maxDepth函数的节点为空,则返回0;否则分别递归该节点的左右子树,然后比较其递归结果,返回大的那个结果+1。
2024-05-05 12:48:33 472
原创 【LeetCode刷题记录】简单篇-101-对称二叉树
给你一个二叉树的根节点root, 检查它是否轴对称。以这棵树为例,要判断一棵树是否对称,首先要看根节点是否为空,为空则直接默认为是对称的,返回true即可,不为空则要判断根节点的左右子树是否对称,即判断两个红框内的子树是否相等。对于两颗子树对称,判断的是蓝框是否相等和绿框是否相等。如何判断?很容易看出来,其实就是判断一棵树的左孩子和另一棵树的右孩子是否相等,及一棵树的右孩子和另一棵树的左孩子是否相等(一棵树看左孩子,另一棵树就看右孩子),依次类推,如果该树还有多层,使用递归即可。
2024-05-04 17:03:26 659 1
原创 【LeetCode刷题记录】简单篇-100-相同的树
给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。我们先考虑极端情况,即两棵树均为空树,此时仍然认为两树相等,可以单独提出来做特殊处理。其余的情况即非空树,而所有非空二叉树在遍历时候的一个共同点就是递归操作。(在上一篇博客中也提到过,二叉树的所有题目几乎都是在遍历的基础上进行操作的,而二叉树遍历最简单的方法就是递归)。所以要判断两棵树是否相同,实际上我们只需要考虑当前节点、左子树、右子树三个部分,而左右子树都是
2024-05-03 16:31:00 523 1
原创 【LeetCode刷题记录】简单篇-94-二叉树的中序遍历
给定一个二叉树的根节点root,返回它的中序遍历。在二叉树的遍历中,最常用的两种办法,分别是递归法和迭代法法一:递归法遍历二叉树有四种方法,前序遍历,中序遍历,后序遍历和层次遍历。除了层次遍历以外,前三种遍历方法用递归的方式实现的逻辑是相同的,都是①递归左子树,②递归右子树,③输出root三个步骤,区别仅仅在于三个步骤的顺序。法二:迭代法
2024-05-02 17:50:56 738 2
原创 【LeetCode刷题记录】简单篇-88-合并两个有序数组
给你两个按非递减顺序排列的整数数组nums1和nums2,另有两个整数m和n,分别表示nums1和nums2中的元素数目。请你合并nums2到nums1中,使合并后的数组同样按非递减顺序排列。注意:最终,合并后数组不应由函数返回,而是存储在数组nums1中。为了应对这种情况,nums1的初始长度为m + n,其中前m个元素表示应合并的元素,后n个元素为0,应忽略。nums2的长度为n。法一:先合并再排序先说我的做法,先合并再排序。
2024-05-01 18:19:55 71
原创 【LeetCode刷题记录】简单篇-83-删除排序链表中的重复元素
给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。这里用单指针的做法,用一个struct ListNode类型的指针cur遍历整个链表,cur初始化指向head链表,判断cur->val与cur->next->val的关系:
2024-04-30 17:37:15 629 1
原创 【LeetCode刷题记录】简单篇-70-爬楼梯
假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?法一:递归递归方法,在代码中表现为函数的自身嵌套,这也是很好想到的一种方法。刚才讲了这道题的本质规律func(n) = func(n-1) + func(n-2),在代码中func就是求方法数的函数climbStairs(n)法二:动态规划动态规划是一种常见的算法思想,它是一种解决多阶段决策问题的优化方法。核心思想是将原问题分解为若干个相同的子问题,分别求解这些子问题并将其结果保存
2024-04-28 16:25:07 1405 1
原创 【LeetCode刷题记录】简单篇-69-x的平方根
给你一个非负整数x,计算并返回x的算术平方根。由于返回类型是整数,结果只保留整数部分,小数部分将被舍去 。注意:不允许使用任何内置指数函数和算符,例如pow(x, 0.5)或者x ** 0.5。法一:暴力法因为只用返回下取整的算术平方根,所以直接用一个变量 i 从1开始遍历就行,当 i*i > x的时候退出循环,返回 i - 1即可。法二:二分法首先定义左右边界,左边界left是0,右边界right是x/2+1(当x ≥ 4时,其算术平方根的范围是[0,x/2+1) ,
2024-04-27 12:41:25 565 1
原创 【LeetCode刷题记录】简单篇-67-二进制求和
给你两个二进制字符串a和b,以二进制字符串的形式返回它们的和。所以为了便于理解,最开始就直接将两个字符串逆置,然后从前往后遍历,对应位相加,同时存储到res中的位置也相同,这样就可以用一个遍历i来表示所有的位置,最后再将res逆置回来。
2024-04-26 19:30:17 690 1
原创 【LeetCode刷题记录】简单篇-66-加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。逆序找到第一个不为9的数,将其加1,这个数之前的所有数不变,之后的数全部置0即可。但是还有一种特殊情况:数组中的数全为9
2024-04-25 14:33:33 598 1
原创 【LeetCode刷题记录】简单篇-58-最后一个单词的长度
给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中最后一个单词的长度。单词是指仅由字母组成、不包含任何空格字符的最大子字符串。逆序遍历只需要遍历完一个单词就可以break了。代码逻辑几乎与刚才的正序遍历一样,唯一有一点不同的是当遇到字母的时候,正序遍历是tmp++,len=tmp,而在逆序遍历中要加上循环提前跳出的判断条件:i != 0 && s[i-1] == ' '
2024-04-24 16:40:22 614
原创 【LeetCode刷题记录】简单篇-35-搜索插入位置
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(log n)的算法。二分查找是经典的查找算法。思想也很简单,把数组以中间元素为分隔,分成两半,每次只查一半,所以也叫折半查找。每次都查询数组中的中间的元素是不是target,是就直接返回索引,不是就再到以中间元素为分隔的左区间或者右区间去查找,直到找到或者不满足循环条件 left
2024-04-23 12:55:27 396
原创 【LeetCode刷题记录】简单篇-28-找出字符串中第一个匹配项的下标
给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从 0 开始)。如果needle不是haystack的一部分,则返回-1。这道题是经典的字符串匹配问题:即在主串寻找子串,如果存在子串则返回子串在主串中的起始位置,如果不存在则直接返回-1。给出两种解法。
2024-04-22 20:09:07 1369 1
原创 【LeetCode刷题记录】简单篇-27-移除元素
给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
2024-04-21 11:00:58 665 1
原创 【LeetCode刷题记录】简单篇-26-删除有序数组中的重复项
给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:一、更改数组nums,使nums的前k个元素包含唯一元素,并按照它们最初在nums中出现的顺序排列。nums的其余元素与nums的大小不重要。二、返回k。
2024-04-20 18:45:54 1059
原创 【LeetCode刷题记录】简单篇-21-合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。最简单的思想,两个链表中的元素依次比对,小的一个加入结果链表,然后再比对下一个元素,直到一个链表中所有元素均被加入结果链表,此时另一个还没有遍历完的链表中剩下的元素直接按序全部加入结果链表即可。若一个链表为空,则另一个链表即为结果链表。
2024-04-18 17:58:50 418 1
原创 【LeetCode刷题记录】简单篇-20-有效的括号
给定一个只包括'(',')','[',']','{','}'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。
2024-04-07 13:18:04 985
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人