![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
小栗子pola
这个作者很懒,什么都没留下…
展开
-
leetcode200.岛屿数量 Python
题目:给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例:输入:grid =[ [“1”,“1”,“0”,“0”,“0”], [“1”,“1”,“0”,“0”,“0”], [“0”,“0”,“1”,“0”,“0”], [“0”,“0”,“0”,“1”,“1”] ]输出:3思路:二维数组DFS依次遍历矩阵中原创 2021-08-30 20:41:06 · 523 阅读 · 0 评论 -
leetcode46.全排列 Python
题目:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。示例:输入:nums = [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]思路:回溯法用递归实现回溯,创建一个数值集合来存放遍历过的数,调用递归函数进行递归,传入数组,空路径,结果列表,遍历过的数的集合,当路径长度等于数组长度时,将路径添加进结果列表里。注意,注意,往结果列表里放的是路径的复制品,不是路径本身,因为在原创 2021-08-30 17:12:56 · 685 阅读 · 0 评论 -
leetcode238.除自身以外数组的乘积 Python
题目:给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。进阶:你可以在常数空间复杂度内完成这个题目吗?( 出于对空间复杂度分析的目的,输出数组不被视为额外空间。)示例:输入: [1,2,3,4]输出: [24,12,8,6]思路:建立一个结果数组,初始化为1。然后先从前往后遍历,第i项代表前i原创 2021-08-30 15:28:30 · 269 阅读 · 0 评论 -
leetcode461.汉明距离 Python
题目:两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。给你两个整数 x 和 y,计算并返回它们之间的汉明距离。示例:输入:x = 1, y = 4输出:2解释:1 (0 0 0 1)4 (0 1 0 0) ↑ ↑上面的箭头指出了对应二进制位不同的位置。思路:位运算先将两个数异或,就是相同为0不同为1,然后再计算异或结果里1的个数,就是两个数对应的二进制位不同的数目。异或后的s,和1按位与,判断最后一位是1还是0,如果是0,按位与结原创 2021-08-30 11:32:48 · 402 阅读 · 0 评论 -
leetcode494.目标和 Python
题目:给你一个整数数组 nums 和一个整数 target 。向数组中的每个整数前添加 ‘+’ 或 ‘-’ ,然后串联起所有整数,可以构造一个 表达式 :例如,nums = [2, 1] ,可以在 2 之前添加 ‘+’ ,在 1 之前添加 ‘-’ ,然后串联起来得到表达式 “+2-1” 。返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目。示例:输入:nums = [1,1,1,1,1], target = 3输出:5解释:一共有 5 种方法让最终目标和为原创 2021-08-30 10:44:05 · 443 阅读 · 0 评论 -
leetcode416.分割等和子集 Python
题目:给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。示例:输入:nums = [1,5,11,5]输出:true解释:数组可以分割成 [1, 5, 5] 和 [11] 。思路:动态规划类似于279完全平方数,322零钱兑换,是简单的背包问题,这里是每个元素都只能使用一次,要把数组分成两部分,每部分的和相等,那数组之和一定是偶数,所以如果不是偶数可直接返回假。目标值是数组之和的一半,然后这个就是包了,数组元素就是原创 2021-08-29 20:34:49 · 459 阅读 · 0 评论 -
leetcode322.零钱兑换 Python
题目:给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。你可以认为每种硬币的数量是无限的。示例:输入:coins = [1, 2, 5], amount = 11输出:3解释:11 = 5 + 5 + 1思路:动态规划建立一个长度为amount+1的动态数组,其中dp[i]表示要组成i块钱,需要的最少硬币数,先初始化每个位置上硬币数为正无穷原创 2021-08-29 17:17:54 · 495 阅读 · 0 评论 -
leetcode309.最佳买卖股票时机含冷冻期 Python
题目:给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。示例:输入: [1,2,3,0,2]输出: 3解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]思路:动态规划考虑三个状态,买入,卖出,不操作(包括冷冻期)买入利润的更原创 2021-08-29 15:46:51 · 172 阅读 · 0 评论 -
leetcode279.完全平方数 Python
题目:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。给你一个整数 n ,返回和为 n 的完全平方数的 最少数量 。完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 11 不是。示例:输入:n = 12输出:3解释:12 = 4 + 4 + 4思路:动态规划完全背包问题,对于本题就是有一个一定容量的背包,然后原创 2021-08-28 17:13:37 · 541 阅读 · 2 评论 -
leetcode221.最大正方形 Python
题目:在一个由 ‘0’ 和 ‘1’ 组成的二维矩阵内,找到只包含 ‘1’ 的最大正方形,并返回其面积。示例:输入:matrix = [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]输出:4思路:动态规划定义一个动态矩阵,其中每个位置表示以当前位置为右下角,能够得到的最大正方形的边长。初始化为全0,然后遍历矩阵,当遍历位置的数为0时直接跳过即可。当遍历位原创 2021-08-28 15:57:33 · 322 阅读 · 0 评论 -
leetcode198.打家劫舍 Python
题目:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。示例:输入:[2,7,9,3,1]输出:12解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 +原创 2021-08-28 15:08:37 · 183 阅读 · 0 评论 -
leetcode152.乘积最大子数组 Python
题目:给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。思路:动态规划因为数组中有负数,一个最小的负数乘以一个负数有可能得到一个最大值,所以定义两个变量表示遍历到当前位置的最大乘积和最小乘积。当前位置的最大乘积可以是当前元素本身,可以是前一位置的最大乘积乘以当前数,也可以是前一位置的最小乘积乘以当前数,这三个数中的最大的,同理原创 2021-08-27 22:18:56 · 399 阅读 · 0 评论 -
leetcode64.最小路径和 Python
题目:给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。说明:每次只能向下或者向右移动一步。示例:输入:grid = [[1,3,1],[1,5,1],[4,2,1]]输出:7解释:因为路径 1→3→1→1→1 的总和最小。思路:动态规划可以直接在矩阵上修改,减小时间复杂度,把当前位置的数改为到当前位置的最小路径,起始位置不用变,直接跳过进行后面的运算,在行为0或者列为0的两个边界上,计算方法不同,行为0的时候计算最小原创 2021-08-27 21:45:04 · 353 阅读 · 0 评论 -
leetcode62.不同路径 Python
题目:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?示例:输入:m = 3, n = 7输出:28思路:动态规划因为每次只能向下或者向右移动一位,所以到达一个位置的路径应该是从上面到这个位置和从左边到这个位置的路径之和,于是就有动态规划的公式为d[i][j] = d[i-1][j] + d[i][j-1]直接遍原创 2021-08-27 10:48:17 · 132 阅读 · 0 评论 -
leetcode55.跳跃游戏 Python
题目:给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例:输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3步到达最后一个下标。思路:贪心,维护一个变量来更新当前位置能够到达的最大索引,遍历数组来更新这个变量,遍历完成以后判断最大索引是否大于或者等于数组长度减1。注意,在遍历过程中,如果能到达的最大索引原创 2021-08-26 10:46:40 · 247 阅读 · 0 评论 -
leetcode338.比特位计数 Python
题目:给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。示例:输入: 2输出: [0,1,1]思路:动态规划,第一个数字0,1的个数就是0,从1开始遍历,如果是偶数,那二进制的最后一位是0,那它的1的个数就和i除以2这个数的1的个数相同,所以 dp[i] = dp[i/2]。当为奇数时,二进制的最后一位是1,那它1的个数是 (i-1)/2这个数的1的个数再加1,就是最后一位这个1。最后返回动态数组。时间和原创 2021-08-25 15:48:05 · 101 阅读 · 0 评论 -
leetcode240.搜索二维矩阵二 Python
题目:编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例:输入:matrix =[[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]],target = 5输出:true思路:按照矩阵的规律来遍历矩阵,从左到右,从上到下都是递增的数组,可以从左下角开始遍历,正好等于原创 2021-08-25 15:01:33 · 187 阅读 · 0 评论 -
leetcode287.寻找重复数 Python
题目:给定一个包含 n + 1 个整数的数组 nums ,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,找出 这个重复的数 。你设计的解决方案必须不修改数组 nums 且只用常量级 O(1) 的额外空间。示例:输入:nums = [1,3,4,2,2]输出:2思路:将问题转化为有环的链表找入口的问题,以数组[1,3,4,2]为例,初始化索引0,由索引0找到数组1,将1作为索引找到数字3,将3作为索引找到数组2,将2作原创 2021-08-25 11:13:32 · 362 阅读 · 0 评论 -
leetcode34.在排序数组中查找元素的第一个和最后一个位置 Python
题目:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。进阶:你可以设计并实现时间复杂度为 O(log n) 的算法解决此问题吗?示例:输入:nums = [5,7,7,8,8,10], target = 8输出:[3,4]思路:二分查找,根据要求的时间复杂度,肯定要用二分查找,这里要进行两次二分查找,第一次是要找大于或者等于目标值的左边界,第二次是要找第一个大原创 2021-08-24 20:51:52 · 180 阅读 · 0 评论 -
leetcode33.搜索旋转排序数组 Python
题目:整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。给你 旋转后 的数组 nums 和一个整原创 2021-08-24 15:34:39 · 126 阅读 · 0 评论 -
leetcode300.最长递增子序列 Python
题目:给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。示例:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。思路:方法1,动态规划建立一个动态数组,来表示遍历到数组的对应位置时,当前的递增子序列的长度,具体过程是遍历数组,遍历到原创 2021-08-23 15:21:45 · 305 阅读 · 0 评论 -
leetcode406.根据身高重建队列 Python
题目:假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。示例:输入:people = [[7,0],[4,4],原创 2021-08-21 11:48:42 · 475 阅读 · 0 评论 -
leetcode347.前K个高频元素 Python
题目:给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]思路:桶排序先建立一个字典来统计数组中每个数出现的次数,然后建立一个二维数组,这个二维数组的索引表示每个桶的序号,初始化每个桶是一个空列表,然后读取字典中的键值对,让值也就是出现的频率作为二维数组的索引,将键也就是数放进对应的桶里,这样出现频率相同的数就放进了同一个桶里,并且出现频率就是原创 2021-08-21 10:10:54 · 474 阅读 · 0 评论 -
leetcode215.数组中的第K个最大元素 Python
题目:给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例:输入: [3,2,1,5,6,4] 和 k = 2输出: 5思路:方法1,先快速排序,再从前往后索引到第长度减k个最小元素,即第k个最大的元素。但是这种方法时间和空间复杂度太高,需要把全部元素都排序一遍,再索引。具体过程是先执行快排函数,第一步是让数组的第一个元素当基准,将它放在合适的位置,同时将数组分为基准左右两个部分,这两个原创 2021-08-20 20:26:39 · 1274 阅读 · 0 评论 -
leetcode148.排序链表 Python
题目:给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。进阶:你可以在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序吗?示例:输入:head = [4,2,1,3]输出:[1,2,3,4]思路:递归,归并排序按照题目时间复杂度的要求,可以使用归并排序将链表按照升序排列,归并排序实现的整体思路是先将链表分成两半,然后对左右两半部分分别递归进行归并排序,最后将递归排序好的两部分按照归并排序合并在一起,最后输出合并后的链表。具体过程是传原创 2021-08-19 17:10:49 · 478 阅读 · 1 评论 -
leetcode399.除法求值 Python
题目:给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。返回 所有问题的答案 。如果存在某个无法确定的答案,则原创 2021-08-15 19:14:49 · 320 阅读 · 2 评论 -
leetcode437.路径总和三 Python
题目:给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。示例:输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8输出:3解释:和等于8 的路径有 3 条,如图所示。思路:使用递归进行先序遍历,初始化路径条数是0,字典中放的是不同的前缀和作原创 2021-08-15 16:21:44 · 118 阅读 · 0 评论 -
leetcode337.打家劫舍三 Python
题目:在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。示例:输入: [3,2,3,null,3,null,1] 3 / \ 2 3 \ \原创 2021-08-14 15:23:02 · 209 阅读 · 0 评论 -
leetcode236.二叉树的最近公共祖先 Python
题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。思路:找最近的公共祖先,用递归的思路是首先传入根节点,如果根节原创 2021-08-13 21:40:19 · 268 阅读 · 3 评论 -
leetcode208.实现Trie(前缀树) Python
题目:Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean startsWi原创 2021-08-13 20:46:39 · 265 阅读 · 0 评论 -
leetcode207.课程表 Python
题目:你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1 。请你判断是否可能完成所有课程的学习?如果可以,返回 true ;否则,返回 false 。示例:输入:n原创 2021-08-12 21:01:18 · 613 阅读 · 0 评论 -
leetcode114.二叉树展开为链表 Python
题目:给你二叉树的根结点 root ,请你将它展开为一个单链表:展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。示例:输入:root = [1,2,5,3,4,null,6]输出:[1,null,2,null,3,null,4,null,5,null,6]思路:方法1,迭代和递归因为将二叉树展开为单链表的序列顺序就是对二叉树进行先序遍历的顺序,所以可以先对二叉树原创 2021-08-12 16:47:04 · 209 阅读 · 0 评论 -
leetcode105.从前序与中序遍历序列构造二叉树 Python
题目:给定一棵树的前序遍历 preorder 与中序遍历 inorder。请构造二叉树并返回其根节点。示例:Input:preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]Output:[3,9,20,null,null,15,7]思路:递归,先考虑特殊情况,整体思路是先由前序遍历找到根节点,再找到根节点在中序遍历序列中的索引位置,这样把前序遍历和中序遍历序列都分成两部分进行递归,所以根节点的左子树就是调用原函数,参数就是前序和中序遍历原创 2021-08-12 15:28:41 · 222 阅读 · 0 评论 -
leetcode102.二叉树的层序遍历 Python
题目:给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层序遍历结果:[ [3], [9,20], [15,7] ]思路:层序遍历,广度优先遍历,用队列实现。这里用数组模拟队列,先判断特殊情况,然后在队列里放入根节点,维护一个一维数组放每一行的元素,先把根节点的值放进去,然后进入循环,先原创 2021-08-12 11:43:48 · 112 阅读 · 0 评论 -
leetcode538.把二叉搜索树转换为累加树 Python
题目:给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。提醒一下,二叉搜索树满足下列约束条件:节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。示例:输入:[4,1,6,0,2,5,7,null,null,null,3,null,null,null,8]输出:[30,36,21,36,35,2原创 2021-08-11 21:26:08 · 135 阅读 · 0 评论 -
leetcode98.验证二叉搜索树 Python
题目:给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。示例:输入:2/ \1 3输出: true思路:如果是二叉搜索树,那中序遍历得到的结果应该是升序排列的,所以我们维护当前遍历节点的前一个节点,比较是不是后边的节点大,如果不是直接返回false,如果在循环中没有返回,就说明遍历到的节点都满足条件,在跳出循环后返回真。原创 2021-08-11 20:39:33 · 146 阅读 · 0 评论 -
leetcode96.不同的二叉搜索树 Python
题目:给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。示例:输入:n = 3输出:5思路:二叉搜索树也叫二叉查找树或者二叉排序树,整个二叉树的所有子树都是左子树的节点值小于根节点的值小于右子树的值。当一共有n个节点,我们以第i个节点为根节点,那1到i-1的节点会作为左子树,i+1到n的节点会构成右子树,由于当分别以1到n的节点为根节点时,左右子树的构成中根节点的选择也会不一样,所以不会有重复的情况出现。原创 2021-08-11 15:58:32 · 238 阅读 · 0 评论 -
leetcode 617.合并二叉树 Python
题目:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例:注意: 合并必须从两个树的根节点开始。思路:递归,深度优先遍历终止条件就是当有一个节点为空时,直接返回另一个子树即可。整体过程是先合并根节点,然后连接根节点的左右子树,左子树来自递归调用合并函数,将两个根节点的整个左子树合并,内部递归实现,右原创 2021-08-10 22:31:03 · 193 阅读 · 0 评论 -
leetcode543.二叉树的直径 Python
题目:给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。示例:给定二叉树 1 / \ 2 3 / \ 4 5返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。注意:两结点之间的路径长度是以它们之间边的数目表示。思路:递归,深度优先遍历求直径就是求两个节点之间的最大距离,结果应该是从根节点出发,左子树的最大路径长度和右子树的最大原创 2021-08-10 21:57:47 · 176 阅读 · 0 评论 -
leetcode226.翻转二叉树 Python
题目:翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \ 1 3 6 9输出: 4 / \ 7 2 / \ / \ 9 6 3 1思路:方法1,递归,交换根节点的左右两个分支节点,递归调用翻转函数,实现对整个二叉树的翻转。方法2,迭代,使用队列翻转二叉树,对当前元素交换左右子树的位置,然后判断左子树是否为空,不为空就放入原创 2021-08-10 21:21:26 · 246 阅读 · 0 评论