LeetCode刷题
LeetCode刷题
一角钱技术
Java架构师
展开
-
637. 二叉树的层平均值
637. 二叉树的层平均值给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。示例 1:输入: 3 / \ 9 20 / \ 15 7输出:[3, 14.5, 11]解释:第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。提示:节点值的范围在32位有符号整数范围内。方法1:深度优先搜索算法思路:使用深度优先搜索计算二叉树的层平均值,需要维护两个数组,counts 用于存储二叉原创 2020-09-12 20:46:39 · 464 阅读 · 0 评论 -
107. 二叉树的层次遍历 II
107. 二叉树的层次遍历 II给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其自底向上的层次遍历为:[ [15,7], [9,20], [3]]方法1:广度优先搜索 BFS算法思路:树的层次遍历可以使用广度优先搜索实现。从根节点开始搜索,每次遍历同一层的全部节点原创 2020-09-06 21:23:09 · 297 阅读 · 0 评论 -
257. 二叉树的所有路径
257. 二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3前言我们要实现这样一个遍历或者搜索的话,毫无疑问我们要保证的事情就是。每个结点都要访问一次每个结点仅仅要访问一次对于结点访问的顺序不限深度优先:原创 2020-09-04 11:35:24 · 258 阅读 · 0 评论 -
394. 字符串解码
394. 字符串解码给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例 1:输入:s = "3[a]2[bc]"输出:"aaabcbc"原创 2020-09-03 18:19:31 · 121 阅读 · 0 评论 -
20. 有效的括号
20. 有效的括号给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例 1:输入: "()"输出: true 示例 2:输入: "()[]{}"输出: true 示例 3:输入: "(]"输出: false 示例 4:输入: "([)]"输出: false 示例 5:输入: "原创 2020-08-31 17:17:47 · 120 阅读 · 0 评论 -
841. 钥匙和房间
841. 钥匙和房间有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码: 0,1,2,...,N-1 ,并且房间里可能有一些钥匙能使你进入下一个房间。在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i] ,每个钥匙 rooms[i][j] 由 [0,1,...,N-1] 中的一个整数表示,其中 N = rooms.length 。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。最初,除 0 号房原创 2020-08-31 16:05:04 · 269 阅读 · 0 评论 -
1. 两数之和
1. 两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]方法1:暴力法算法思路:暴力法很简单,遍历每个元素 x,并查找是否存在一个值与原创 2020-08-30 12:33:02 · 104 阅读 · 0 评论 -
238. 除自身以外数组的乘积
238. 除自身以外数组的乘积给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例:输入: [1,2,3,4]输出: [24,12,8,6]提示:题目数据保证数组之中任意元素的全部前缀元素和后缀(甚至是整个数组)的乘积都在 32 位整数范围内。说明: 请原创 2020-08-30 11:36:53 · 170 阅读 · 0 评论 -
120. 三角形最小路径和
120. 三角形最小路径和给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。说明:如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那原创 2020-08-25 23:00:43 · 133 阅读 · 0 评论 -
917. 仅仅反转字母
917. 仅仅反转字母给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。示例 1:输入:"ab-cd"输出:"dc-ba"示例 2:输入:"a-bC-dEf-ghIj"输出:"j-Ih-gfE-dCba"示例 3:输入:"Test1ng-Leet=code-Q!"输出:"Qedo1ct-eeLg=ntse-T!"提示:S.length <= 10033 <= S[i].ASCIIcode <= 122原创 2020-08-24 15:32:18 · 178 阅读 · 0 评论 -
557. 反转字符串中的单词 III
557. 反转字符串中的单词 III给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。示例:输入:"Let's take LeetCode contest"输出:"s'teL ekat edoCteeL tsetnoc"提示:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。方法1:使用自带的 split 和 reverse 函数参考代码1:class Solution { public String reverseWord原创 2020-08-24 15:31:42 · 287 阅读 · 0 评论 -
82. 删除排序链表中的重复元素 II
82. 删除排序链表中的重复元素 II给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。示例 1:输入: 1->2->3->3->4->4->5输出: 1->2->5示例 2:输入: 1->1->1->2->3输出: 2->3方法1:递归算法思路:找终止条件:当 head 指向链表只剩一个元素的时候,自然是不可重复的,因此 return ;以 1->1->原创 2020-08-24 12:06:52 · 155 阅读 · 0 评论 -
83. 删除排序链表中的重复元素
83. 删除排序链表中的重复元素给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2 示例 2:输入: 1->1->2->3->3输出: 1->2->3方法1:遍历算法思路:这是一个简单的问题,仅测试你操作链表的结点指针的能力。由于输入的链表已排序,因此我们可以通过将结点的值与它之后的结点的值进行比较确定它是否为重复结点。如果它重复,我们更改当前结点的 next 指针原创 2020-08-24 11:51:32 · 144 阅读 · 0 评论 -
91. 解码方法
91. 解码方法一条包含字母 A-Z 的消息通过以下方式进行了编码:'A' -> 1'B' -> 2...'Z' -> 26给定一个只包含数字的非空字符串,请计算解码方法的总数。示例 1:输入: "12"输出: 2解释: 它可以解码为 "AB"(1 2)或者 "L"(12)。示例 2:输入: "226"输出: 3解释: 它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。解析递归和动态规划两种解法,重点原创 2020-08-23 22:49:45 · 363 阅读 · 0 评论 -
151. 翻转字符串里的单词
151. 翻转字符串里的单词给定一个字符串,逐个翻转字符串中的每个单词。示例 1:输入: "the sky is blue"输出: "blue is sky the"示例 2:输入: " hello world! "输出: "world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: "a good example"输出: "example good a原创 2020-08-23 21:07:39 · 356 阅读 · 0 评论 -
541. 反转字符串 II
541. 反转字符串 II给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。如果剩余字符少于 k 个,则将剩余字符全部反转。如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。示例:输入: s = "abcdefg", k = 2输出: "bacdfeg"提示:该字符串只包含小写英文字母。给定字符串的长度和 k 在 [1, 10000] 范围内。方法1:双指针法算法思路:每 2原创 2020-08-23 21:07:07 · 167 阅读 · 0 评论 -
344. 反转字符串
344. 反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]示例 2:输入:["H","a","n","n","a","h"]输出:["h","a","n","n","a"原创 2020-08-23 15:46:04 · 159 阅读 · 0 评论 -
14. 最长公共前缀
14. 最长公共前缀编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: ["flower","flow","flight"]输出: "fl"示例 2:输入: ["dog","racecar","car"]输出: ""解释: 输入不存在公共前缀。说明:所有输入只包含小写字母 a-z 。算法思路:把所有的字符串对齐排在一起,然后来检查第一列是否相同,相同则看第二列,依次往下。最开始出现有一列字符不相同原创 2020-08-23 15:16:33 · 75 阅读 · 0 评论 -
1080. 根到叶路径上的不足节点
1080. 根到叶路径上的不足节点给定一棵二叉树的根 root,请你考虑它所有 从根到叶的路径:从根到任何叶的路径。(所谓一个叶子节点,就是一个没有子节点的节点)假如通过节点 node 的每种可能的 “根-叶” 路径上值的总和全都小于给定的 limit,则该节点被称之为「不足节点」,需要被删除。请你删除所有不足节点,并返回生成的二叉树的根。示例 1:输入:root = [1,2,3,4,-99,-99,7,8,9,-99,-99,12,13,-99,14], limit = 1输出:[1,原创 2020-08-23 13:59:06 · 255 阅读 · 0 评论 -
679. 24 点游戏
679. 24 点游戏你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到24。示例 1:输入: [4, 1, 8, 7]输出: True解释: (8-4) * (7-1) = 24示例 2:输入: [1, 2, 1, 2]输出: False注意:除法运算符 / 表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。每个运算符对两个数进行运算。特别是我们不能用 -&原创 2020-08-22 21:58:21 · 880 阅读 · 0 评论 -
15. 三数之和
15. 三数之和给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[ [-1, 0, 1], [-1, -1, 2]]算法思路:排序 + 双指针特判,对于数组长度 len,如果数组为 null原创 2020-08-21 14:07:50 · 110 阅读 · 0 评论 -
111. 二叉树的最小深度
111. 二叉树的最小深度给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2.算法思路这里先注意一下 1, 2 这个测试用例,写在前面。题目中的说明:叶子节点是指没有子节点的节点,针对 1,2 这个测试案例,1 不是叶子节点,原创 2020-08-21 10:04:57 · 120 阅读 · 0 评论 -
8. 字符串转换整数 (atoi)
8. 字符串转换整数 (atoi)请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。该字符串在有效的整数部分之后也可能会存在多余的字符,那么这些字符可以被忽略,它们对函数不应该造成影响。原创 2020-08-20 18:15:34 · 181 阅读 · 0 评论 -
771. 宝石与石头
771. 宝石与石头给定字符串 J 代表石头中宝石的类型,和字符串 S 代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。示例 1:输入: J = "aA", S = "aAAbbbb"输出: 3示例 2:输入: J = "z", S = "ZZ"输出: 0注意:原创 2020-08-20 16:37:22 · 202 阅读 · 0 评论 -
387. 字符串中的第一个唯一字符
387. 字符串中的第一个唯一字符给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。示例:s = "leetcode"返回 0s = "loveleetcode"返回 2提示:你可以假定该字符串只包含小写字母。方法1:线性时间复杂度解法(Map)算法思路:遍历一遍字符串,然后把字符串中每个字符出现的次数保存在一个散列表中。这个过程的时间复杂度为 O(N),其中 N 为字符串的长度。接下来需要再遍历一遍字符串,利用散列表来检测遍历每个字符是不是唯一原创 2020-08-20 14:55:51 · 199 阅读 · 0 评论 -
122. 买卖股票的最佳时机 II
122. 买卖股票的最佳时机 II解题思路方法1:暴力搜索可能暴力搜索不能让有些面试官满意,但我觉得可以以搜索算法为起点,考虑更好的算法。根据题意,没有限制交易次数,在每一天,我们就可以根据当前是否持有股票选择相应的操作,这里 “暴力搜索” 也叫 “回溯搜索”、“回溯算法”,首先画出树形图。class Solution { private int res; public int maxProfit(int[] prices) { if (prices == nu原创 2020-07-14 15:55:51 · 190 阅读 · 0 评论 -
874. 模拟行走机器人
874. 模拟行走机器人审题以示例2为例,先把题目意思搞明白。输入: commands = [4, -1, 4, -2, 4], obstacles = [[2,4]] 输出: 机器人所经过的每个坐标点 (x, y) 到原点的欧式距离的平方的最大值。欧式距离:x2+y2\sqrt{x^2 + y^2}x2+y2 欧式距离的平方:$ x2+y2 $如上图所示: 机器人初始位置坐标点(0,0) 初始方向为 向北。读取第一个指令为4,沿着当前当前方向“北”,向前走4个单位,停在坐标点9原创 2020-07-15 15:38:12 · 468 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
236. 二叉树的最近公共祖先解题思路祖先的定义: 若节点 ppp 在节点 rootrootroot 的左(右)子树中,或 p=rootp = rootp=root,则称 rootrootroot 是 ppp 的祖先。最近公共祖先的定义: 设节点 rootrootroot 为 节点 p、qp、qp、q 的某公共祖先,若其左子节点 root.leftroot.leftroot.left 和 右子节点 root.rightroot.rightroot.right 都不是 p、qp、qp、q 的公共祖先原创 2020-07-16 15:45:43 · 212 阅读 · 0 评论 -
1143. 最长公共子序列(LCS)
1143. 最长公共子序列(LCS)最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经典的面试题目,因为它的解法是典型的二维动态规划,大部分比较困难的字符串问题都和这个问题一个套路,比如说编辑距离。而且,这个算法稍加改造就可以用于解决其他问题,所以说LCS算法是值得掌握的。所谓子序列,就是要保留原始顺序,但可以是不连续的。审题之后你可能会有疑问,这个问题为啥就是动态规划来解决呢?因为子序列类型的问题,穷举出所有可能的结果都不容易,而动态规划算法做的就是穷举原创 2020-07-24 18:31:33 · 434 阅读 · 0 评论 -
410. 分割数组的最大值
410. 分割数组的最大值解题思路审题之后可以得出结论,结果必定在[max(nums), sum(bums)] 这个区间内,因为左端点对应每个单独的元素构成一个子数组,右端点对应所有元素构成一个子数组。方法1:二分法通过示例 nums = [7,2,5,10,8] 来进行分析当 m = 1, 那么整个数组作为一部分,最小的最大值为32 当 m = n, 那么每个元素作为一个子数组,从所有元素选取最大值,最小的最大值为 10所以,m 的取值范围为 1 <= m <= n,因此,最大原创 2020-07-25 15:39:41 · 602 阅读 · 0 评论 -
102. 二叉树的层序遍历
102. 二叉树的层序遍历解题思路DFS 与 BFS让我们先看看在二叉树上进行DFS遍历和BFS遍历的代码比较。DFS 遍历使用递归:void dfs(TreeNode root) { if (root == null) { return; } dfs(root.left); dfs(root.right);}BSF 遍历使用队列数据结构:void bfs(TreeNode root) { Queue<TreeNode>原创 2020-07-13 20:24:26 · 148 阅读 · 0 评论 -
46. 全排列
46. 全排列解题思路解决一个回溯问题,实际上就是一个决策树的遍历过程。你只需要思考3个问题:路径:也就是已经做出的选择。选择列表:也就是你当前可以做的选择。结束条件:也就是到达决策树底层,无法再做选择的条件。回溯算法的框架result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径); return for 选择 in 选择列表: 做选择 backtrack(路径, 选择列表);原创 2020-07-13 11:50:44 · 287 阅读 · 0 评论 -
315.计算右侧小于当前元素的个数
315.计算右侧小于当前元素的个数解题思路暴力破解,两层for循环嵌套,O(n^2) 最后测试会超时,需要优化。方法1:使用 BST(二叉搜索/排序数)BST(二叉搜索/排序数) Java代码class Solution { // 采用二叉搜索的做法,在树节点除了有val值外,还有个count值,用于记录它的左子树上有多少个节点 // 这样,最开始那个点形成的树节点,count值是0 public List<Integer> countSmaller(in原创 2020-07-13 11:44:39 · 313 阅读 · 0 评论 -
58. 最后一个单词的长度
58. 最后一个单词的长度给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例:输入: "Hello World"输出: 5思路:字符串遍历从字符串末尾向前遍历,其中主要有两种情况第一种情况:以字符串 "Hello Word" 为例,从后向前遍历直到遍历到头或者遇到空格为止,即为最原创 2020-08-20 13:06:06 · 181 阅读 · 1 评论 -
709.转换成小写字母
709.转换成小写字母实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。示例 1:输入: "Hello"输出: "hello"示例 2:输入: "here"输出: "here"示例 3:输入: "LOVELY"输出: "lovely"方法1:ASCCII码思路:通过 ASCII 码表操作字符串即可。a-z:97-122 A-Z:65-90原创 2020-08-20 11:16:47 · 135 阅读 · 1 评论 -
647.回文子串
647.回文子串给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。示例 1:输入:"abc"输出:3解释:三个回文子串: "a", "b", "c" 示例 2:输入:"aaa"输出:6解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"提示:输入的字符串长度不会超过 1000 。参考思路1. 定义状态dp[i][j] 表示从位置 i 到 j 上原创 2020-08-19 23:00:03 · 148 阅读 · 0 评论 -
42. 接雨水
42. 接雨水解题思路1. 暴力 时间O(N2)O(N^2)O(N2) 空间O(1)O(1)O(1)审题之后可以发现每个柱子顶部可以储水的高度,当前柱子的左右两侧最大高度的较小者减去当前柱子的高度。因此我们只需要遍历每个柱子,累加每个柱子可以储水的高度即可。参考代码1class Solution { public int trap(int[] height) { if (height == null || height.length == 0) return 0;原创 2020-07-25 18:00:14 · 1023 阅读 · 2 评论