LeetCode题解
简单记录一下平时刷题的重难点,训练算法能力。
lly-rachel
这个作者很懒,什么都没留下…
展开
-
LeetCode 300. 最长递增子序列
一、问题描述给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。二、测试数据示例 1:输入:nums = [10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。示例 2:输入:nums = [0,1,0,3,2,3]输出:4示例 3:输入:nums =原创 2021-09-02 15:10:08 · 81 阅读 · 0 评论 -
LeetCode 802. 找到最终的安全状态 [java实现]
一、问题描述在有向图中,以某个节点为起始节点,从该点出发,每一步沿着图中的一条有向边行走。如果到达的节点是终点(即它没有连出的有向边),则停止。对于一个起始节点,如果从该节点出发,无论每一步选择沿哪条有向边行走,最后必然在有限步内到达终点,则将该起始节点称作是 安全 的。返回一个由图中所有安全的起始节点组成的数组作为答案。答案数组中的元素应当按 升序 排列。该有向图有 n 个节点,按 0 到 n - 1 编号,其中 n 是 graph 的节点数。图以下述形式给出:graph[i] 是编号 j 节点的原创 2021-08-05 11:00:47 · 115 阅读 · 0 评论 -
LeetCode 743. 网络延迟时间 [java实现]
一、问题描述有 n 个网络节点,标记为 1 到 n。给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。 二、测试数据示例 1:输入:times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2输出:2原创 2021-08-02 16:11:48 · 362 阅读 · 0 评论 -
LeetCode 1104. 二叉树寻路 [java实现]
一、问题描述在一棵无限的二叉树上,每个节点都有两个子节点,树中的节点 逐行 依次按 “之” 字形进行标记。如下图所示,在奇数行(即,第一行、第三行、第五行……)中,按从左到右的顺序进行标记;而偶数行(即,第二行、第四行、第六行……)中,按从右到左的顺序进行标记。给你树上某一个节点的标号 label,请你返回从根节点到该标号为 label 节点的路径,该路径是由途经的节点标号所组成的。 二、测试数据示例 1:输入:label = 14输出:[1,3,4,14]示例 2:输入:label原创 2021-07-29 15:29:25 · 87 阅读 · 0 评论 -
LeetCode 863. 二叉树中所有距离为 K 的结点 [java实现]
一、问题描述给定一个二叉树(具有根结点 root), 一个目标结点 target ,和一个整数值 K 。返回到目标结点 target 距离为 K 的所有结点的值的列表。 答案可以以任何顺序返回。 二、测试数据示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], target = 5, K = 2输出:[7,4,1]解释:所求结点为与目标结点(值为 5)距离为 2 的结点,值分别为 7,4,以及 1注意,输入的 "root" 和 "target原创 2021-07-28 16:11:24 · 157 阅读 · 0 评论 -
LeetCode 1713. 得到子序列的最少操作次数 [java实现]
一、问题描述给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素。每一次操作中,你可以在 arr 的任意位置插入任一整数。比方说,如果 arr = [1,4,1,2] ,那么你可以在中间添加 3 得到 [1,4,**3**,1,2] 。你可以在数组最开始或最后面添加整数。请你返回 最少 操作次数,使得 target 成为 arr 的一个子序列。一个数组的 子序列 指的是删除原数组的某些元素(可能一个元素都不删除),同时不改变其余元素的相对原创 2021-07-26 10:53:09 · 181 阅读 · 0 评论 -
LeetCode 1743. 从相邻元素对还原数组 [java实现]
一、问题描述存在一个由 n 个不同元素组成的整数数组 nums ,但你已经记不清具体内容。好在你还记得 nums 中的每一对相邻元素。给你一个二维整数数组 adjacentPairs ,大小为 n - 1 ,其中每个 adjacentPairs[i] = [ui, vi] 表示元素 ui 和 vi 在 nums 中相邻。题目数据保证所有由元素 nums[i] 和 nums[i+1] 组成的相邻元素对都存在于 adjacentPairs 中,存在形式可能是 [nums[i], nums[i+1]] ,也原创 2021-07-25 14:14:47 · 107 阅读 · 0 评论 -
LeetCode 1838. 最高频元素的频数 [java实现]
一、问题描述元素的 频数 是该元素在一个数组中出现的次数。给你一个整数数组 nums 和一个整数 k 。在一步操作中,你可以选择 nums 的一个下标,并将该下标对应元素的值增加 1 。执行最多 k 次操作后,返回数组中最高频元素的 最大可能频数 。 二、测试数据示例 1:输入:nums = [1,2,4], k = 5输出:3解释:对第一个元素执行 3 次递增操作,对第二个元素执 2 次递增操作,此时 nums = [4,4,4] 。4 是数组中最高频元素,频数是 3 。 示原创 2021-07-19 16:26:21 · 148 阅读 · 0 评论 -
LeetCode 面试题 10.02. 变位词组 [java实现]
一、问题描述编写一种方法,对字符串数组进行排序,将所有变位词组合在一起。变位词是指字母相同,但排列不同的字符串。 二、测试数据示例 1:输入: ["eat", "tea", "tan", "ate", "nat", "bat"],输出:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]提示:所有输入均为小写字母。不考虑答案输出的顺序。 三、解题思路利用 HashMap 键值对存储区分字符串 HashMap<Str原创 2021-07-18 17:24:13 · 138 阅读 · 0 评论 -
LeetCode 53. 最大子序和 [java实现]
一、问题描述给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 二、测试数据示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:输入:nums = [1]输出:1提示:1 <= nums.length <= 3 * 104-105 <= nums[i] <= 105 三、解题思路贪心算法:原创 2021-07-17 15:34:11 · 82 阅读 · 0 评论 -
LeetCode 剑指 Offer 53 - I. 在排序数组中查找数字 I [java实现]
一、问题描述统计一个数字在排序数组中出现的次数。 二、测试数据示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0提示:0 <= 数组长度 <= 50000 三、解题思路 利用 二分查找找到最左边符合要求的位序找到最右边符合要求的位序//找到最左边符合要求的位序 public int binarySearchFin原创 2021-07-16 17:33:34 · 76 阅读 · 0 评论 -
LeetCode 1818. 绝对差值和 [java实现]
一、问题描述给你两个正整数数组 nums1 和 nums2 ,数组的长度都是 n 。数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)的 总和(下标从 0 开始)。你可以选用 nums1 中的 任意一个 元素来替换 nums1 中的 至多 一个元素,以 最小化 绝对差值和。在替换数组 nums1 中最多一个元素 之后 ,返回最小绝对差值和。因为答案可能很大,所以需要对 109 + 7 取余 后返回。|x| 定原创 2021-07-14 16:25:45 · 273 阅读 · 0 评论 -
LeetCode 981. 基于时间的键值存储 [java实现]
一、问题描述创建一个基于时间的键值存储类 TimeMap,它支持下面两个操作:set(string key, string value, int timestamp)存储键 key、值 value,以及给定的时间戳 timestamp。get(string key, int timestamp)返回先前调用 set(key, value, timestamp_prev) 所存储的值,其中 timestamp_prev <= timestamp。如果有多个这样的值,则返回原创 2021-07-10 16:34:55 · 115 阅读 · 0 评论 -
LeetCode 403. 青蛙过河 [java实现]
一、问题描述 一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k - 1、k 或 k + 1 个原创 2021-05-05 23:11:13 · 144 阅读 · 0 评论 -
LeetCode 363. 矩形区域不超过 K 的最大数值和 [java实现]
一、问题描述 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。 题目数据保证总会存在一个数值和不超过 k 的矩形区域。 二、测试数据示例 1:输入:matrix = [[1,0,1],[0,-2,3]], k = 2输出:2解释:蓝色边框圈出来的矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。示例 2:输入:matrix = [[2,2,-1]], k原创 2021-04-22 16:15:42 · 158 阅读 · 1 评论 -
LeetCode 91. 解码方法 [java实现]
一、问题描述一条包含字母 A-Z 的消息通过以下映射进行了 编码 :'A' -> 1'B' -> 2...'Z' -> 26要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“11106” 可以映射为:"AAJF" ,将消息分组为 (1 1 10 6)"KJF" ,将消息分组为 (11 10 6)注意,消息不能分组为 (1 11 06) ,因为 “06” 不能映射为 “F” ,这是由于 “6” 和 “06”原创 2021-04-21 16:10:05 · 121 阅读 · 1 评论 -
LeetCode 220. 存在重复元素 III [java实现]
一、问题描述给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。如果存在则返回 true,不存在返回 false。 二、测试数据示例 1:输入:nums = [1,2,3,1], k = 3, t = 0输出:true示例 2:输入:nums = [1,0,1,1], k = 1, t = 2输出:true示例 3:原创 2021-04-18 14:37:18 · 144 阅读 · 0 评论 -
LeetCode 213. 打家劫舍 II [java实现]
一、问题描述你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,能够偷窃到的最高金额。 二、测试数据示例 1:输入:nums = [2,3,2]输出:3解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额原创 2021-04-15 20:44:03 · 243 阅读 · 0 评论 -
LeetCode 208. 实现 Trie (前缀树) [java实现]
一、问题描述 Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回true(即,在检索之前已经插入);否则,返回 false 。boolean sta原创 2021-04-14 16:22:23 · 100 阅读 · 0 评论 -
LeetCode 179. 最大数 [java实现]
一、问题描述 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。 **注意:**输出结果可能非常大,所以你需要返回一个字符串而不是整数。 二、测试数据示例 1:输入:nums = [10,2]输出:"210"示例 2:输入:nums = [3,30,34,5,9]输出:"9534330"示例 3:输入:nums = [10]输出:"10"示例 4:输入:nums = [0,0]输出:"0"提示:1 <= nums.原创 2021-04-12 17:14:14 · 177 阅读 · 0 评论 -
LeetCode 264. 丑数 II [java实现]
一、问题描述 给你一个整数 n ,请你找出并返回第 n 个 丑数 。 丑数 就是只包含质因数 2、3 和/或 5 的正整数。 二、测试数据示例 1:输入:n = 10输出:12解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。示例 2:输入:n = 1输出:1解释:1 通常被视为丑数。提示:1 <= n <= 1690 三、解题思路 获取第 N 个丑数:利用小的丑数 * 2、3、5 获得更大的丑数原创 2021-04-11 13:57:12 · 154 阅读 · 0 评论 -
LeetCode 面试题 17.21. 直方图的水量 [java实现]
一、问题描述 给定一个直方图(也称柱状图),假设有人从上面源源不断地倒水,最后直方图能存多少水量?直方图的宽度为 1。 上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的直方图,在这种情况下,可以接 6 个单位的水(蓝色部分表示水)。 感谢 Marcos 贡献此图。难度:困难 二、测试数据示例 1:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6 三、解题思路动态规划 思路从左边扫描得到 left[m] 右边 right[原创 2021-04-02 16:58:24 · 169 阅读 · 0 评论 -
LeetCode 1006. 笨阶乘 [java实现]
一、问题描述 通常,正整数 n的阶乘是所有小于或等于 n 的正整数的乘积。例如,factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1。 相反,我们设计了一个笨阶乘clumsy:在整数的递减序列中,我们以一个固定顺序的操作符序列来依次替换原有的乘法操作符:乘法(*),除法(/),加法(+)和减法(-)。 例如,clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1。然而,这些运算仍然使用通常的算原创 2021-04-01 14:04:00 · 121 阅读 · 0 评论 -
LeetCode 190. 颠倒二进制位 [java实现]
一、问题描述颠倒给定的 32 位无符号整数的二进制位。提示:请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。二、测试数据示例 1:输入: 00000010100101000001111原创 2021-03-29 21:04:41 · 81 阅读 · 0 评论 -
LeetCode 61. 旋转链表 [java实现]
LeetCode 61. 旋转链表 [java实现]一、问题描述给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。难度:中等二、测试数据示例 1:输入:head = [1,2,3,4,5], k = 2输出:[4,5,1,2,3]示例 2:输入:head = [0,1,2], k = 4输出:[2,0,1]提示:链表中节点的数目在范围 [0, 500] 内-100 <= Node.val <= 1000 <= k <=原创 2021-03-27 14:11:46 · 121 阅读 · 0 评论 -
LeetCode 341.扁平化嵌套列表迭代器 [java实现]
问题描述给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。难度:中等测试数据示例 1:输入: [[1,1],2,[1,1]]输出: [1,1,2,1,1]解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]。示例 2:输入: [1,[4,[6]]]输出: [1,4,6]解释: 通过重复原创 2021-03-23 15:53:58 · 101 阅读 · 1 评论 -
LeetCode 115.不同的子序列 [java实现]
不同的子序列 leetcode问题描述: 字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是) 题目数据保证答案符合 32 位带符号整数范围。 难度:困难 提示:0 <= s.length, t.length <= 1000s 和 t 由英文字母组成 测试数据:示例一:输入:s = "rabbbit", t =原创 2021-03-17 22:06:33 · 125 阅读 · 0 评论