
LeetCode题目
keavykk
这个作者很懒,什么都没留下…
展开
-
LeetCode128. 冗余连接
题目描述给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。请你设计并实现时间复杂度为 O(n) 的算法解决此问题。示例 1:输入:nums = [100,4,200,1,3,2]输出:4解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。涉及tag并查集;动态规划算法思路方法1:遍历数组中的元素,设置一个cur,保存nums[i]持续+1的数字(保证连续),去查找cur是否在数组中(判断cur == nums[j]可以设原创 2022-04-15 17:14:09 · 624 阅读 · 0 评论 -
LeetCode200. 岛屿问题
题目描述涉及tag网格问题网格问题类比二叉树问题,下面给出网格问题的框架代码:void dfs(int[][] grid, int r, int c) { // 判断退出递归条件 // 如果坐标 (r, c) 超出了网格范围,直接返回 if (!inArea(grid, r, c)) { return; } // 访问上、下、左、右四个相邻结点 dfs(grid, r - 1, c); dfs(grid, r + 1, c);原创 2022-04-14 15:38:06 · 694 阅读 · 0 评论 -
LeetCode133. 克隆图
题目描述给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。涉及tagdfs;图;bfs算法思路用哈希表,node为键,value为值,如果已经有node节点,就直接用get方法去取,如果没有,就new一个新的节点。示例代码1dfsclass Solution { public Node cloneGraph(Node node) { Map<Node, No原创 2022-04-13 15:48:03 · 283 阅读 · 0 评论 -
二叉树习题总结(一)
144. 二叉树的前序遍历借助栈class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); if (root == null) return res; Stack<TreeNode> stack = new Stack<>();原创 2022-04-13 09:17:08 · 715 阅读 · 0 评论 -
LeetCode235. 二叉搜索树的最近公共祖先
题目描述给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”涉及tag二叉搜索树算法思路情况1:两个节点在根节点的左右两侧->返回根节点情况2:其中一个是根节点->返回根节点情况3:两个根节点在根节点同侧->继续查找代码1和代码2给出非递归和递归的两种写法示例代码3给出所有二叉原创 2022-04-11 17:09:10 · 77 阅读 · 0 评论 -
LeetCode40. 组合总和2
题目描述给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。涉及tag二叉树;dfs;回溯算法思路做法1:这道题目和39组合总和类似,多了一个去重要求。理解过程中需要注意的点:1 dfs是遍历完一个树枝上的所有节点才会去遍历另一个树枝2 begin变量的设置,是相对于同一层其他树枝而言,而对于每一原创 2022-04-10 17:29:25 · 642 阅读 · 0 评论 -
LeetCode39. 组合总和
题目描述给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复被选取。如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target 的不同组合数少于150个。涉及tag回溯;剪枝;二叉树;dfs算法思路和全排列类型是一种题目。本题采用两原创 2022-04-06 15:35:17 · 583 阅读 · 0 评论 -
LeetCode27. 全排列2
题目描述给定一个可包含重复数字的序列 nums ,按任意顺序返回所有不重复的全排列。涉及tag回溯;剪枝;二叉树算法思路和第46全排列的区别在于进行一个列表的去重处理。对于单个的元素可以用哈希表,而对于列表,可以进行排序,排序之后数组中相等的两个数字相邻。依然使用状态变量used来记录节点状态,如果true表示在树中不用再动,而false表示不管是未选择还是被从path中移除,目前都是可以被选择进入path的状态。示例代码class Solution { public List<原创 2022-04-06 13:05:30 · 1033 阅读 · 0 评论 -
LeetCode46. 全排列
题目描述给定一个不含重复数字的数组 nums ,返回其所有可能的全排列。你可以按任意顺序返回答案。涉及tagbfs;二叉树;回溯算法思路根据题意画出树形图,从根节点开始,随着深度的增加,每一层选择前面没选过的数字参与排列,直到最后的叶子节点上所有数字参与的全排列。示例代码class Solution { List<List<Integer>> res = new ArrayList<>(); public List<List<In原创 2022-04-05 17:11:46 · 506 阅读 · 0 评论 -
LeetCode337. 打家劫舍3
题目描述小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root。除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。涉及tag二叉树-bfs算法思路方法1:本题是一道动态规划的题目。把单个节点看做爷爷,它能获得最多的钱有两种途径,1自己的钱加原创 2022-04-05 11:38:35 · 560 阅读 · 0 评论 -
LeetCode129. 求根节点到叶子节点数字之和
题目描述给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。每条从根节点到叶节点的路径都代表一个数字:例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。计算从根节点到叶节点生成的 所有数字之和 。叶节点 是指没有子节点的节点。算法思路1:dfs2:字符串收集,转成整形,自然形成数字。示例代码1class Solution { public int sumNumbers(TreeNode root) {原创 2022-04-03 19:40:16 · 767 阅读 · 0 评论 -
LeetCode437. 路径总和3
算法思路方法1:bfs进行穷举。方法2:前缀和结合哈希表1 前缀和的概念:前缀和就是在根节点到当前节点的路径中,包含当前节点值在内的所有节点val的和。2 前缀和的应用:两个节点的前缀和差值 = 这两个节点的路径和3 哈希表的作用:Map.getOrDefault(key,默认值);Map中会存储一一对应的key和value。如果 在Map中存在key,则返回key所对应的的value。如果 在Map中不存在key,则返回默认值。在本题中,key表示前缀和,value表示前缀和为该值的节原创 2022-04-03 17:49:08 · 971 阅读 · 0 评论 -
二叉树模板
//二叉树算法的设计的总路线:明确一个节点要做的事情,然后剩下的事抛给框架。void traverse(TreeNode root) { //root需要做的事情 traverse(root.left); traverse(root.right);}//如何把所有二叉树的节点值加一void traverse(TreeNode root) { if (root == null) return; root.val += 1; traverse(root.转载 2022-04-03 11:32:25 · 85 阅读 · 0 评论 -
LeetCode100. 相同的树
题目描述给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。算法思路递归。示例代码class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if (p == null && q == null) return true; if (p == null || q == null) return原创 2022-04-03 11:29:05 · 459 阅读 · 0 评论 -
LeetCode113. 路径总和2
题目描述给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点是指没有子节点的节点。涉及tag二叉树算法思路bfs和dfs示例代码1//深度优先遍历class Solution { List<List<Integer>> ret = new LinkedList<List<Integer>>(); Deque<Integer> pa原创 2022-04-02 21:25:17 · 73 阅读 · 0 评论 -
LeetCode22.括号生成
题目描述数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。涉及tag回溯算法;动态规划;剪枝算法思路隐形二叉树:将所有的括号大小情况看做一棵二叉树,每个节点中存放当前左右括号的个数,采用dfs,每遍历一个节点就把对应的左括号或者右括号减去一个,同时将减去的括号放在暂时存放结果的字符串中。当左右括号都等于0的时候说明到了叶子节点,此时将字符串放入结果集。代码1是非回溯操作,代码2是回溯操作。非回溯操作用string存储遍历路径,而回溯操作用的是strin原创 2022-04-02 20:05:59 · 527 阅读 · 0 评论 -
LeetCode112. 路径总和
题目描述给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。涉及tag二叉树算法思路递归算法:如果存在这样的路径,从根节点向下进行深度优先遍历一直到叶子结点,在遍历过程中将遍历到的val值都从targetnum中减去,最后得到的值应该就是当前叶子节点的值。递归终止条件:当前根节点已原创 2022-04-02 10:28:52 · 112 阅读 · 0 评论 -
LeetCode98. 验证搜索二叉树
题目描述给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。有效二叉搜索树定义如下:节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。涉及tag二叉树算法思路递归判断:1 找终止条件:什么时候递归到头?当有一个节点的值不在以左子树值和右子树值为上下界的区间范围内if (root.val <= lower || root.val >= upper) { retur原创 2022-04-01 11:03:33 · 69 阅读 · 0 评论 -
LeetCode110. 平衡二叉树
题目描述给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。涉及tag二叉树算法思路1 递归算法,根据二叉树的平衡性自底向上判断:当发现二叉树不平衡的时候,返回-1。最底部是叶子节点,子树必然是平衡的,此时它(左或右子树)和它的兄弟节点的高度差只能是0或者1,当它作为子树形成新的二叉树的时候,它的根节点在的高度会+1,此时的新树并不一定保持平衡。2 递归算法,求每个节点的深度并判断每个子树的深度差是否原创 2022-04-01 09:29:44 · 66 阅读 · 0 评论 -
LeetCode103. 二叉树的锯齿形层序遍历
题目描述给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行。涉及tag二叉树算法思路使用双端队列level来储存val,通过level.offerFirst()和level.offerLast()分别从头部和尾部增加元素,达到锯齿形效果。可以使用奇偶数进行判断,也可以用布尔类型的标志位来回转换将每一行区分开。示例代码1(奇偶数)class Solution { public List<Lis原创 2022-03-29 16:51:22 · 1414 阅读 · 0 评论 -
LeetCode145. 二叉树的后序遍历
题目描述给你树的根节点root,返回这棵树的后序遍历。涉及tag二叉树算法思路递归算法,非递归算法借助栈实现,在前序遍历的基础上加一条翻转语句。示例代码1class Solution { public List<Integer> postorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); postorder (root, res)原创 2022-03-27 09:55:50 · 982 阅读 · 0 评论 -
LeetCode144. 二叉树的前序遍历
题目描述给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。涉及tag二叉树算法思路前序中树节点排列顺序:根、左、右。后序中树节点排列顺序:左、根、右。前序中子树的第一个节点就是根节点,比较寻找中序里和前序第一个节点相等的节点即为根节点。根节点左侧是左子树,右侧是右子树。本题采用递归构造方法。示例代码...原创 2022-03-27 09:24:46 · 78 阅读 · 0 评论 -
LeetCode101.对称二叉树
题目描述给你一个二叉树的根节点root,判断二叉树是否是轴对称涉及tag二叉树算法思路如果示例代码原创 2022-03-26 16:22:00 · 537 阅读 · 0 评论 -
LeeTCode226. 翻转二叉树
题目描述给你一棵二叉树的根节点root,翻转这棵树,并返回根节点root。涉及tag二叉树算法思路递归:1 输入值和返回值:传入的是根节点,返回根节点public TreeNode invert(TreeNode root)2 递归结束条件:父节点成功反转,父节点的左子树和右子树也成功反转TreeNode keeper = root.left;root.left = root.right;root.right = keeper;root = root.left;3 每层递归逻原创 2022-03-26 12:32:29 · 1246 阅读 · 0 评论 -
LeetCode111. 二叉树的最小深度
题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。涉及tag二叉树算法思路递归算法:1 确定返回值和传入参数:返回深度,传入节点rootpublic int minDepth(TreeNode root)2 找出递归结束条件:当root没有左子树和右子树的时候,返回1if (root.left == null && right == null) return 1;当root有一个子树为原创 2022-03-26 11:09:53 · 302 阅读 · 0 评论 -
LeetCode559. N叉树的最大深度
题目描述给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例。涉及tag二叉树算法思路注意:foreach的语句格式:for(变量类型 变量名称 :遍历对象){Java语句;(通过变量传递参数)}示例代码1//递归class Solution { public int maxDepth(Node root) { if (root == null) re原创 2022-03-26 09:25:18 · 82 阅读 · 0 评论 -
LeetCode104.二叉树的最大深度
题目描述给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。涉及tag二叉树算法思路使用前序遍历求解的是深度,使用后序遍历求解的是高度,本题使用前序和后序其实都可以(根节点的高度其实就是二叉树的最大深度)。本题采用递归法和迭代法(非递归)两种方式进行求解。递归法:递归法有三个步骤:1 确定递归函数的参数和返回值。2 确定终止条件。3 确定单层递归的逻辑。按照以上步骤对本题进行分析:1 确定递归函数的参数和返回值:参数就是传入树的根节点,返回就返原创 2022-03-25 21:37:42 · 761 阅读 · 0 评论 -
LeetCode102. 二叉树的层序遍历
题目描述给你二叉树的根节点 root,返回其节点值的层序遍历。 (即逐层地,从左到右访问所有节点。涉及tag二叉树算法思路本题借助数据结构队列,借助队列的先进先出特性,将根节点、根节点的下一层所有节点(从左往右)送入队列,最终得到层序遍历之后的新树。首先将根节点入queue,变量n存放每一层的节点数,node变量存放新树的每一颗子树的根节点,level存放每一层节点的val值,res = sum(level),返回res。示例代码class Solution { public Lis原创 2022-03-25 21:12:37 · 359 阅读 · 0 评论 -
LeetCode.124 二叉树中的最大路径和
题目描述路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和是路径中各节点值的总和。给你一个二叉树的根节点 root ,返回其最大路径和 。涉及tag二叉树算法思路本题要求找到各节点总值并返回最大值,类似数组的返回最大之总数和,也是需要将当前节点的value和0进行比较,如果大于0 加入路径,否则加入路径没有意义。采用递归+分治法,仅仅考虑包含当前root节点的单边最原创 2022-03-25 10:56:53 · 336 阅读 · 0 评论 -
LeetCode230. 二叉搜索树中的第K小的元素
题目描述给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)涉及tag二叉树算法思路二叉搜索树的性质:左子树节点value小于根节点value,右子树节点valu大于根节点value。结合栈这个数据结构,通过入栈和出栈的顺序从最小到最大返回节点的value。结合第94题,当k等于0的时候说明已经遍历到第k小的元素。见示例代码1。为避免每一个都遍历,可以比较k和左子树包含元素的大小,讨论:情况1:k =左子树的节点个数,返回左原创 2022-03-24 18:46:30 · 145 阅读 · 0 评论 -
LeetCode94. 二叉树的中序遍历
题目描述给定一个二叉树的根节点 root ,返回它的中序遍历 。涉及tag二叉树算法思路熟悉中序遍历的实现。示例代码1展示通过栈实现中序遍历,示例代码2为递归实现。示例代码1//维护一个栈实现中序遍历class Solution { public List<Integer> inorderTraversal(TreeNode root) { Deque <TreeNode> stack = new LinkedList<TreeNode原创 2022-03-24 17:00:39 · 65 阅读 · 0 评论 -
LeetCode105. 从前序与中序序列构造二叉树
题目描述涉及tag算法思路构造一棵二叉树需要知道前序遍历和中序遍历的左边界和右边界。前序遍历的顺序是根节点、左子树、右子树,而中序遍历的顺序是左子树、根节点、右子树,拿前序的第一个节点寻找中序中的和该节点相同的节点,中序中根节点左侧就是左子树,右侧就是右子树。本题采用递归调用的方式进行构造,用先序遍历和中序遍历里左右子树的边界的索引进行对树的描述。如示例代码1。引入哈希表简化查找中序中根节点的索引,简化时间复杂度,如示例代码2。示例代码1 public class TreeNode {原创 2022-03-24 15:47:48 · 552 阅读 · 0 评论 -
LeetCode1283. 使结果不超过阈值的最小除数
题目描述给你一个整数数组 nums 和一个正整数 threshold ,你需要选择一个正整数作为除数,然后将数组里每个数都除以它,并对除法结果求和。请你找出能够使上述结果小于等于阈值 threshold 的除数中最小的那个。每个数除以除数后都向上取整,比方说 7/3 = 3 , 10/2 = 5 。题目保证一定有解。涉及tag二分法算法思路题目要求找出使上述结果小于等于阈值 threshold 的除数中的最小值,上述结果是sum,找到的sum越小越安全,sum尽可能小表明除数应尽可能大,而原创 2022-03-22 17:26:03 · 1360 阅读 · 0 评论 -
LeetCode875. 爱吃香蕉的珂珂
题目描述珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。涉及tag二分法算法思路二分法常规题目的解法把题目所求的解直接设定为搜原创 2022-03-22 16:54:54 · 160 阅读 · 0 评论 -
LeetCode287. 寻找重复数
题目描述给定一个包含 n + 1 个整数的数组 nums,其数字都在 [1, n]范围内(包括1和n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,返回这个重复的数 。你设计的解决方案必须不修改数组nums且只用常量级 O(1) 的额外空间。涉及tag二分法算法思路根据抽屉原理,如果5个苹果放在4个抽屉里,一定有至少一个抽屉的苹果数量大于或者等于两个。从数组中任意选择一个数字mid,把数组分为[left , mid]和[mid + 1, right]两个区间。根据抽屉原创 2022-03-22 13:30:01 · 923 阅读 · 0 评论 -
LeetCode69. x的平方根
题目描述给你一个非负整数 x,计算并返回 x 的算术平方根。由于返回类型是整数,结果只保留整数部分,小数部分将被舍去 。涉及tag二分法算法思路根据常识,非负整数中除了0和1以外,其它整数的算术平方根都比它的一半小,因此考虑折半查找。当mid的平方大于x,mid以及比mid大的数字都不可能是x的算术平方根,返回mid之前的整数。否则返回mid。两个需要注意的地方:1 mid = left + (right - left + 1) / 2 ,+1为了避免陷入到查找区间只有left和right原创 2022-03-22 11:31:54 · 210 阅读 · 0 评论 -
LeetCode4. 寻找两个正序数组的中位数
题目描述给定两个大小分别为m和n的正序(从小到大)数组 nums1和nums2。请你找出并返回这两个正序数组的中位数。算法的时间复杂度应该为O(log (m+n)) 。算法思路本题对时间复杂度有要求,用二分法进行查找能够有效降低时间复杂度。解法一:暴力算法,把两个数组合并后遍历查找中位数。解法二: 省略解法一中合并数组的操作,直接在原来的两个数组中进行查找,用指针记录位置。解法三:将题目转化为求第k个数字,分奇偶讨论k与总长度len的关系。示例代码解法一:class Solution {原创 2022-03-20 16:11:42 · 1353 阅读 · 0 评论 -
LeetCode34. 在排序数组中查找元素的第一个和最后一个位置
题目描述给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。算法思路原创 2022-03-20 15:07:24 · 442 阅读 · 0 评论 -
LeetCode中二分查找思想和刷题目录
思路二分查找的唯一思想:逐步缩小搜索空间具体做法:根据题意,得到单调性和能够逐步缩小搜索规模的条件,明确每一轮搜索的范围,进而设置能够使左右区间的边界紧缩的条件细节1 mid要考虑溢出问题,一般设置为mid = left + (right - left) / 2,有时候考虑到当数组只有两个元素的时候要避免死循环,需要在括号里加一:mid = left + (right - left + 1) / 2,如 LeetCode69. x的平方根 这一题。2 二分查找并不一定是有序的,只要数组满足某种规律转载 2022-03-20 10:28:08 · 149 阅读 · 0 评论 -
LeetCode35. 搜索插入位置
题目描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(log n) 的算法。涉及tag二分法查找算法思路题目提示,在数组中寻找,不考虑在超过数组长度的值,应设置right = nums.length - 1讨论:情况一:数组中无目标值,找到第一个大于target的数字并返回其索引。情况二:数组中有目标值,找到第一个等于target的数字并返回其索引。合并为position(target)原创 2022-03-20 10:04:59 · 799 阅读 · 0 评论