力扣刷题
文章平均质量分 75
力扣刷题
努力更文的小白
从事Java后端,小白一枚,还请各位前辈多多指教
展开
-
寻找重复的子树
题目介绍力扣652题:https://leetcode-cn.com/problems/find-duplicate-subtrees/给定一棵二叉树,返回所有重复的子树。对于同一类的重复子树,你只需要返回其中任意一棵的根结点即可。两棵树重复是指它们具有相同的结构以及相同的结点值。分析函数签名如下:List findDuplicateSubtrees(TreeNode root);我来简单解释下题目,输入是一棵二叉树的根节点root,返回的是一个列表,里面装着若干个二叉树节点,这些节点对原创 2021-06-14 23:16:16 · 1851 阅读 · 2 评论 -
从中序与后序遍历序列构造二叉树
题目介绍力扣106题:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树:分析函数签名如下:TreeNode buildTree(原创 2021-06-14 22:57:20 · 258 阅读 · 0 评论 -
从前序与中序遍历序列构造二叉树
题目介绍力扣105题:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/根据一棵树的前序遍历与中序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:分析函数签名如下:TreeNode buildTree(int原创 2021-06-12 19:43:07 · 1130 阅读 · 0 评论 -
最大二叉树
题目介绍力扣654题:https://leetcode-cn.com/problems/maximum-binary-tree/给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:二叉树的根是数组 nums 中的最大元素。左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。返回有给定数组 nums 构建的 最大二叉树 。分析函数签名如下:TreeNode constru原创 2021-06-12 00:34:13 · 1793 阅读 · 0 评论 -
二叉树展开为链表
题目介绍力扣114题:https://leetcode-cn.com/problems/flatten-binary-tree-to-linked-list/分析函数签名如下:void flatten(TreeNode root);我们尝试给出这个函数的定义:给flatten函数输入一个节点root,那么以root为根的二叉树就会被拉平为一条链表。我们再梳理一下,如何按题目要求把一棵树拉平成一条链表?很简单,以下流程:1、将root的左子树和右子树拉平。2、将root的右子树接到左原创 2021-06-10 23:26:54 · 130 阅读 · 1 评论 -
填充每个节点的下一个右侧节点指针
题目介绍力扣116题:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:分析题目的意思就是把二叉树的每一层节点都用next指针连接起来:而且题目说了,输入是一棵「完美二叉树」,形象地说整棵二叉树是一个正三角形,除了最右侧的节点next指针会指向null,其他节点的右侧一定有相邻的节点。这道题怎么做原创 2021-06-10 23:23:05 · 71 阅读 · 0 评论 -
二叉树的最小深度
题目介绍力扣111题:https://leetcode-cn.com/problems/minimum-depth-of-binary-tree/给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。BFS代码框架// 计算从起点 start 到终点 target 的最近距离int BFS(Node start, Node target) { Queue<Node> q; // 核心数据结构 Se原创 2021-06-03 22:00:59 · 129 阅读 · 0 评论 -
汉明距离
题目介绍力扣461题:https://leetcode-cn.com/problems/hamming-distance/两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。分析汉明距离(Hanming Distance)是用于统计两段信息之间差异的概念,有很多用途:在信息论中用来量化字符串的差异,在信息编码中用于错误检测。对于两个字符串而言,汉明距离就是对应位置的不同字符的个数;对两个整数而言,汉明距离是对应位置上数字不同的位数原创 2021-05-25 22:18:23 · 1295 阅读 · 0 评论 -
2的幂
题目介绍利空i231题:https://leetcode-cn.com/problems/power-of-two/给定一个整数,编写一个函数来判断它是否是 2 的幂次方。分析本题是一个数学问题。在计算机系统中,2的整次幂往往有非常重要的意义,往往是众多数据类型能够表示的数值边界,是真正的“整数”。2的整次幂,有很多重要的性质:能被2连续整除写成2进制的形式,就是一个1后面跟着n个0(n≥0)我们可以利用这些特性,构造出不同的解法。方法一:除2判断余数最简单的想法,就是借鉴十进制转换原创 2021-05-25 22:11:16 · 950 阅读 · 0 评论 -
课程表
题目介绍力扣207题:https://leetcode-cn.com/problems/course-schedule/你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] = [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。例如,先修课程对 [0, 1] 表示:想要学习课程 0 ,你需要先完成课程 1原创 2021-05-24 21:48:11 · 201 阅读 · 0 评论 -
二叉树的序列化与反序列化
题目介绍力扣297题:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始原创 2021-05-24 20:53:46 · 245 阅读 · 0 评论 -
电话号码的字母组合
题目介绍力扣17题:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。分析给定数字之后,我们需要遍历每个数字对应字母的所有可能,然后进行组合。题目要求我们返回所有可能的字母组合,所以需要穷举所有解。于是自然想到,我们可以用回溯算法来解决。依原创 2021-05-23 16:33:26 · 108 阅读 · 0 评论 -
全排列
题目介绍力扣46题:https://leetcode-cn.com/problems/permutations/给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。分析很明显,n个不同的数的全排列,应该有n!种情形。这个问题需要暴力穷举。从前到后依次遍历每一个“位置”,每次填入一个数;而之后的一个位置,能够填入的可能性就会少一个。这样,直接用n重循环,考察每个位置就可以得到结果。不过针对本题,数组的长度是不固定的,直接用多重循环的方式显然不妥。我们原创 2021-05-23 16:19:17 · 738 阅读 · 0 评论 -
零钱兑换
题目介绍力扣322题:https://leetcode-cn.com/problems/coin-change/给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。分析这道题要求硬币总面值加起来等于amount,这是一个限制条件。而硬币个数无限供应,所以我们需要做的,就是在满足限制条件的前提下,对于不同的硬币组合,选择一个数量最少的组合。最简单的想原创 2021-05-23 10:47:07 · 69 阅读 · 0 评论 -
打家劫舍
题目介绍力扣198题:https://leetcode-cn.com/problems/house-robber/你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。分析由于不能偷窃连续的房屋,我们自然想到,隔一个偷一间显然是一个不错的选择。那是不是,直接计算原创 2021-05-23 10:38:46 · 78 阅读 · 0 评论 -
最长公共子序列
题目介绍力扣1143题:https://leetcode-cn.com/problems/longest-common-subsequence/给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,“ace” 是 “abcde” 的子序列,但 “aec” 不是 “abcde” 的子序原创 2021-05-22 23:05:17 · 113 阅读 · 0 评论 -
爬楼梯
题目介绍力扣70题:https://leetcode-cn.com/problems/climbing-stairs/假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。分析这是一道非常经典的面试题。爬楼梯需要一步一步爬,很明显,这可以划分阶段、用动态规划的方法来解决。对于爬n级台阶,考虑它的最后一步,总是有两种情况可以到达:从n-1级台阶处,爬1个台阶;或者从n-2级台阶处,爬2个台阶。所以我们可以将原创 2021-05-22 17:47:11 · 61 阅读 · 0 评论 -
买卖股票的最佳时机
题目介绍力扣121题:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。分析最简单的想法是,直接找到最大最小值。但最小值原创 2021-05-22 16:46:30 · 84 阅读 · 0 评论 -
任务调度器
题目介绍力扣621题:https://leetcode-cn.com/problems/task-scheduler/给你一个用字符数组 tasks 表示的 CPU 需要执行的任务列表。其中每个字母表示一种不同种类的任务。任务可以以任意顺序执行,并且每个任务都可以在 1 个单位时间内执行完。在任何一个单位时间,CPU 可以完成一个任务,或者处于待命状态。然而,两个 相同种类 的任务之间必须有长度为整数 n 的冷却时间,因此至少有连续 n 个单位时间内 CPU 在执行不同的任务,或者在待命状态。你需要原创 2021-05-20 23:10:13 · 784 阅读 · 0 评论 -
跳跃游戏II
题目介绍力扣45题:https://leetcode-cn.com/problems/jump-game-ii/给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。假设你总是可以到达数组的最后一个位置。分析本题跳跃规则跟上题一致,并且已经保证可以到达最后一个位置,现在是希望得到最小的跳跃步数。要想步数最小,很容易想到的一个思路是,每一步都迈到最大,也就是直接跳到当前能达到的最远位置。这是典型的贪心策原创 2021-05-19 23:17:34 · 175 阅读 · 1 评论 -
跳跃游戏
题目介绍力扣55题:https://leetcode-cn.com/problems/jump-game/给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。分析这道题规定数组每个元素,就代表了可以跳跃的最大长度。我们发现,其实只要判断出当前最远可以到达的位置,那么在这之前的元素,其实统统可以跳过。所以我们采用的,就是一个贪心策略:每次都判断一下当前能到达的最远位置,然后再看接下来最远可以到哪里。解原创 2021-05-19 22:51:04 · 76 阅读 · 0 评论 -
验证二叉搜索树
题目介绍力扣98题:https://leetcode-cn.com/problems/validate-binary-search-tree/给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。分析按照二叉搜索树的性质,我们可以想到需要递归地进行判断。这里需要注意的是,如果二叉搜索树的左右子树不为空,那么左子树中的所有节点,值都应该小于根节点;原创 2021-05-18 23:46:01 · 634 阅读 · 0 评论 -
平衡二叉树
题目介绍力扣110题:https://leetcode-cn.com/problems/balanced-binary-tree/给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。分析根据定义,当且仅当一棵二叉树的左右子树也都是平衡二叉树时,这棵二叉树是平衡二叉树。因此可以使用递归的方式,判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下(类似先序遍历)或者自底向上(类似后序遍历)。方法一:自顶向原创 2021-05-18 23:22:43 · 992 阅读 · 0 评论 -
翻转二叉树
题目介绍力扣226题:https://leetcode-cn.com/problems/invert-binary-tree/翻转一棵二叉树。分析这是一道很经典的二叉树问题。显然,我们可以遍历这棵树,分别翻转左右子树,一层层递归调用,就可以翻转整个二叉树了。方法一:先序遍历容易想到,我们可以先考察根节点,把左右子树调换,然后再分别遍历左右子树、依次翻转每一部分就可以了。这对应的遍历方式,就是先序遍历。代码如下:// 1. 先序遍历public TreeNode invertTree1(T原创 2021-05-18 22:37:58 · 189 阅读 · 0 评论 -
合并区间
题目介绍力扣56题:https://leetcode-cn.com/problems/merge-intervals/以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间。分析要判断两个区间[a1, b1], [a2, b2]是否可以合并,其实就是判断是否有a1 <= a2 <= b1,或者a2 <= a1 <= b原创 2021-05-16 19:05:18 · 182 阅读 · 0 评论 -
颜色分类
题目介绍力扣75题:https://leetcode-cn.com/problems/sort-colors/给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。分析本题是经典的“荷兰国旗问题”,由计算机科学家 Edsger W. Dijkstra 首先提出。荷兰国旗是由红白蓝3种颜色的条纹拼接而成,如下图所示:假设这样的条纹有多条,且各种颜色的数原创 2021-05-16 19:01:50 · 384 阅读 · 1 评论 -
数组中的第K个最大元素
题目介绍力扣215题:https://leetcode-cn.com/problems/kth-largest-element-in-an-array/在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。分析要寻找数组中第K大的元素,首先能想到的,当然就是直接排序。只要数组是有序的,那么接下来取出倒数第K个元素就可以了。public class KthLargestElement { // 直接调语言内置的排序方法原创 2021-05-16 18:51:15 · 249 阅读 · 0 评论 -
柱状图中最大的矩形
题目介绍力扣84题:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。分析...原创 2021-05-16 01:37:44 · 745 阅读 · 0 评论 -
有效的括号
题目介绍力扣20题:https://leetcode-cn.com/problems/valid-parentheses/给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。分析判断括号的有效性,这是一个非常经典的问题。由于给定字符串中只包含 ‘(’,’)’,’{’,’}’,’[’,’]’ ,所以我们不需要额外考虑非法字符的问题。对于合法的输入字符,关键原创 2021-05-15 15:34:28 · 70 阅读 · 0 评论 -
使用栈实现队列
题目介绍力扣232题:https://leetcode-cn.com/problems/implement-queue-using-stacks/请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否原创 2021-05-15 14:05:26 · 1820 阅读 · 0 评论 -
使用队列实现栈
题目介绍力扣i225题:https://leetcode-cn.com/problems/implement-stack-using-queues/请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通队列的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:void push(int x) 将元素 x 压入栈顶。int pop() 移除并返回栈顶元素。int top() 返回栈顶元素。boolean empty() 如果栈是空的,返回 true ;否原创 2021-05-15 13:40:45 · 202 阅读 · 0 评论 -
LRU缓存机制
题目介绍力扣146题:https://leetcode-cn.com/problems/lru-cache/运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value)如果关键字已经存在,则原创 2021-05-15 00:09:00 · 237 阅读 · 0 评论 -
最长连续序列
题目介绍力扣128题:https://leetcode-cn.com/problems/longest-consecutive-sequence/给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。进阶:你可以设计并实现时间复杂度为 O(n) 的解决方案吗?分析要寻找连续序列,关键在于找到当前数的“下一个数”(或者叫“后继”)。如果有后继,就在数组中继续找,每找到一个后继,当前序列长度就加1;直到找不到时,就得到了以当前数开始的、最长的连续序列长度原创 2021-05-13 21:52:00 · 1377 阅读 · 0 评论 -
只出现一次的数字
题目介绍力扣136题:https://leetcode-cn.com/problems/single-number/给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?分析这是基于数组的一道题目。题目中除了一个元素之外,其它都出现两次。所以我们可以想到,只要把元素是否出现过记录下来,遍历完数组就可以判断出单独的那个数了。方法一:暴力法基本想法是,遍历数组,把当前所有出现的原创 2021-05-12 23:33:27 · 80 阅读 · 0 评论 -
删除链表的倒数第N个节点
题目介绍力扣19题:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能尝试使用一趟扫描实现吗?分析链表中删除某个节点,其实就是将之前一个节点next,直接指向当前节点的后一个节点,相当于“跳过”了这个节点。当然,真正意义上的删除,还应该回收节点本身占用的空间,进行内存管理。这一点在java中我们可以不考虑,直接由JVM的GC帮我们实现。原创 2021-05-11 23:51:02 · 106 阅读 · 0 评论 -
合并两个有序链表
题目介绍力扣21题:https://leetcode-cn.com/problems/merge-two-sorted-lists/将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。分析链表节点结构已经定义好,而且已经做了升序排列。现在我们需要分别遍历两个链表,然后依次比较,按从小到大的顺序生成新的链表就可以了。这其实就是“归并排序”的思路。方法一:迭代最简单的想法,就是逐个遍历两个链表中的节点,依次比对。我们假设原链表为list1和list2。原创 2021-05-11 23:05:17 · 79 阅读 · 0 评论 -
反转链表
题目介绍力扣206题:https://leetcode-cn.com/problems/reverse-linked-list/给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。分析链表的节点结构ListNode已经定义好,我们发现,反转链表的过程,其实跟val没有关系,只要把每个节点的next指向之前的节点就可以了。从代码实现上看,可以有迭代和递归两种形式。方法一:迭代假设存在链表 1→2→3→null,我们想要把它改成null←1←2←3。我们只需要依次迭代节点遍历链表原创 2021-05-10 23:31:55 · 216 阅读 · 0 评论 -
最小覆盖子串
题目介绍力扣76题:https://leetcode-cn.com/problems/minimum-window-substring/给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。示例 1:输入:s = “ADOBECODEBANC”, t = “ABC”输出:“BANC”示列2:输入:s = “a”, t = “a”输出原创 2021-05-09 04:20:28 · 575 阅读 · 0 评论 -
找到字符串中所有字母异位词
题目介绍力扣438题:https://leetcode-cn.com/problems/find-all-anagrams-in-a-string/给定一个字符串 s 和一个非空字符串 p,找到 s 中所有是 p 的字母异位词的子串,返回这些子串的起始索引。字符串只包含小写英文字母,并且字符串 s 和 p 的长度都不超过 20100。说明:字母异位词指字母相同,但排列不同的字符串。不考虑答案输出的顺序。分析“字母异位词”,指“字母相同,但排列不同的字符串”。注意这里所说的“排列不同”,原创 2021-05-09 04:11:09 · 290 阅读 · 0 评论 -
滑动窗口最大值
题目介绍力扣239题:https://leetcode-cn.com/problems/sliding-window-maximum/给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。分析这是一个典型的滑动窗口的问题。由于滑动窗口的大小k被限定在[1,nums.length],所以我们可以直接推出窗口的个数为nums.length - k + 1。方法一:暴力法最原创 2021-05-08 00:03:40 · 217 阅读 · 0 评论