leetcode题解
面包猎人
我嘛?
展开
-
分治法刷题总结
写在前面 分治法简单理解就是分而治之,将一个复杂的问题通过一定的方式分解成若干个类似的小问题。其实,从字里行间便能体会到递归的含义。没错,本质上来说,我们还是通过分治法求解去体会递归的魅力。至少接下来的三道题,我是这样做的~~ 前排提醒,一开始遇到递归的问题,私以为不要过于追求细节,这样很容易迷失在递归过程中,造成自我怀疑。有一定基础的可以自己画棵树体会过程,或者直接翻题解找到类似的图也可。重要的是体会思想,剩下的就是重复练习。53.最大自序和题目描述 给定一个整数数组 nums ,找到一原创 2020-08-19 22:51:08 · 313 阅读 · 0 评论 -
151. 翻转字符串里的单词
题目链接题目描述:给定一个字符串,逐个翻转字符串中的每个单词。示例 1:输入: “the sky is blue”输出: “blue is sky the”示例 2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: “a good exa...原创 2020-04-11 00:31:46 · 256 阅读 · 0 评论 -
leetcode题解——面试题 01.07. 旋转矩阵
题目链接题目描述:给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?示例 1:给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例 2:给定 matrix =[...原创 2020-04-07 00:54:12 · 211 阅读 · 0 评论 -
leetcode题解——42. 接雨水
题目链接题目描述:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6暴力 暴力方法比较容易思考,即按列计算当前列能装多少雨水。找到当前列的左端最大高度curMaxLeft和右端最大高度curMaxRight,比较出两端最大高度的最小值,再与当前列的高度进...原创 2020-04-04 13:14:31 · 203 阅读 · 0 评论 -
leetcode题解——8. 字符串转换整数 (atoi)
题目链接题目描述:请你来实现一个 atoi函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。该字符串在有效的整数部分之后...原创 2020-04-03 11:52:46 · 140 阅读 · 0 评论 -
leetcode题解——289. 生命游戏
题目链接题目描述:根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:如果活细胞周围八个位置的活细胞数少...原创 2020-04-02 09:57:00 · 448 阅读 · 0 评论 -
leetcode题解——662. 二叉树最大宽度
题目链接题目描述:给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。示例1:示例2:示例3:示例4:BFS 题目提示了我们满二叉树的结构,那让我们来回顾完...原创 2020-03-30 12:37:14 · 394 阅读 · 0 评论 -
leetcode题解——654. 最大二叉树
题目链接题目描述:给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。示例 :解题思路 看了题目的要求,我闻到了浓浓的分治思想,通过最大值索引区分左右子树区间,分治到底~...原创 2020-03-29 18:43:43 · 390 阅读 · 0 评论 -
leetcode题解——448. 找到所有数组中消失的数字
题目链接题目描述:给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6]...原创 2020-03-28 21:43:22 · 303 阅读 · 0 评论 -
5. 最长回文子串
题目链接题目描述:给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”暴力 遍历每一个字串并记录最长的回文字串。另外,要注意c++的substr和java的substring的区别,在内循环的变量...原创 2020-03-27 14:01:55 · 141 阅读 · 0 评论 -
leetcode题解——130. 被围绕的区域
题目链接题目描述:给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 '...原创 2020-03-26 22:20:57 · 265 阅读 · 0 评论 -
合并二叉树
题目链接题目描述:给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。示例:解题思路 题意要求我们合并两个二叉树,那么在某一结点考虑的问题只有三个:两个树的该结点位置均为空;两个树的该结...原创 2020-03-20 18:25:24 · 130 阅读 · 0 评论 -
leetcode#43. 字符串相乘
题目链接题目描述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = “2”, num2 = “3”输出: “6”示例 2:输入: num1 = “123”, num2 = “456”输出: “56088”说明:num1 和 num2 的长度小于110。num1...原创 2020-03-19 15:40:17 · 196 阅读 · 0 评论 -
leetcode#415. 字符串相加
题目链接题目描述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。注意:num1 和num2 的长度都小于 5100.num1 和num2 都只包含数字 0-9.num1 和num2 都不包含任何前导零。你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。解题思路 从num1和num2末尾开始遍历,逐位相加。主要有四方面需...原创 2020-03-19 13:49:28 · 121 阅读 · 0 评论 -
leetcode#71. 简化路径
题目链接题目描述:以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目...原创 2020-03-18 01:44:57 · 183 阅读 · 0 评论 -
leetcode#124. 二叉树中的最大路径和
题目链接题目描述:给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。实例:解题思路 本题属于leetcode hard难度,我认为主要的难度在于你是否真的理解了题意。剩下的就是熟能生巧了~另外,本题与求树的高度和路径一脉相承,有时间可以自行整理~共勉! 题目定义最大路径和是树内任意一...原创 2020-03-16 23:18:11 · 170 阅读 · 0 评论 -
leetcode#136. 只出现一次的数字
题目链接题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 :输入: [2,2,1]输出: 1解题思路 两种思路,第一种非常简单,利用哈希表记录数组元素出现频次即可。空间复杂度O(n),如果想将其降至O(1)呢? 理解题设,除了某个元素...原创 2020-03-14 19:29:08 · 226 阅读 · 0 评论 -
leetcode#234. 回文链表
题目链接题目描述:请判断一个链表是否为回文链表。示例:输入: 1->2输出: false进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?解题思路 始终注意:题设给的数据结构是单链表,意味着我们不能像解决数组一样的随意方向移动指针,而是只能从头结点开始依次遍历到尾,同时也意味着我们无法回溯来解决该问题。所以会有两个考虑方向:一,借用辅助数据结构解...原创 2020-03-14 16:27:40 · 109 阅读 · 0 评论 -
leetcode#239. 滑动窗口最大值
题目链接题目描述:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。实例:解题思路 本题的关键在于如何从滑动窗口中动态获取每一个最大值。这里我们可以考虑维护一个单调队列,简而言之就是始终保证队列中的元素均处在当前滑动窗口范围内且元素由队头至队尾呈单调递减的...原创 2020-03-14 13:30:16 · 103 阅读 · 0 评论 -
leetcode#104. 二叉树的最大深度 & leetcode#559. N叉树的最大深度
二叉树的最大深度题目描述:给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 。N叉树的最大深度题目描述:给定一个 N 叉树,找到其最大深度。最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。例如,...原创 2020-03-12 17:50:19 · 133 阅读 · 0 评论 -
leetcode#129. 求根到叶子节点数字之和
题目链接题目描述:给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。实例:解题思路 与#257思路类似,套用先序遍历框架,将焦点移到对当前结点的操作和对传入参数对设置,剩下的交给递归。...原创 2020-03-12 12:46:40 · 193 阅读 · 0 评论 -
leetcode#101. 对称二叉树
题目链接题目描述:给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。解题思路 本题与#100类似,题解在此~题意是要求判断对称树,本质上来说还是判断两个树的关系。然主函数只给了一个参数root,所以可以考虑添加辅助函数增加参数列表确定两个递归终止条件:一、显然两结点同时为空,那么肯定是相同了;二、如果在两结点中,一个为空,另一个不为...原创 2020-03-10 13:14:19 · 123 阅读 · 0 评论 -
leetcode#100. 相同的树
题目链接题目描述:给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。解题思路 本题与#101类似,题解在此~观察本题,要求对比两个树是否完全相同,主函数给出了两个参数(也就是两个树的根结点),可能就不需要辅助函数扩展参数列表了。确定两个递归终止条件:一、显然两结点同时为空,那么肯定是相同了;二、如果在两结点中,一个...原创 2020-03-10 13:13:33 · 126 阅读 · 0 评论 -
leetcode#106. 从中序与后序遍历序列构造二叉树
题目链接题目描述:根据一棵树的中序遍历与后序遍历构造二叉树。声明 本题与#105几乎一致(题解在此~),可以学会105然后自己敲一遍106以巩固提升。 与105两点区别:根结点遍历要从后序遍历数组最后一位开始,这是由后序遍历的顺序而定的。根右左建树,因为是后序遍历数组确定根结点值且后序遍历数组倒序就是根右左,所以要先右后左。 其实,练习过105和106,可能更加理解为什么...原创 2020-03-10 00:13:20 · 144 阅读 · 0 评论 -
leetcode#105. 从前序与中序遍历序列构造二叉树
题目链接题目描述:根据一棵树的前序遍历与中序遍历构造二叉树。太经典了,不需要例子了~解题思路 还是给一个例子吧!前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 如果这是一道选择填空甚至应用题,我们会怎么做?由前序遍历特点可知,根结点root是"排头兵",也就是3。根据root值找到中序遍历数组中的...原创 2020-03-09 02:01:17 · 138 阅读 · 0 评论 -
leetcode#347. 前 K 个高频元素
题目链接题目描述:给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]解题思路遍历数组,哈希表录入频率遍历哈希表,维护一个出现频率前k多的小根堆优先队列已满,需要判断当前元素的频率是否大于优先队列的最小频率元素的频率,如果大于,则替换。优先队列未满,进队即可注意:c++ 优先队...原创 2020-03-07 00:30:15 · 135 阅读 · 0 评论 -
leetcode#279. 完全平方数(优化思路)
题目链接题目描述:给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, ...)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。实例:输入: n = 12输出: 3解释: 12 = 4 + 4 + 4.解题思路 可以将整个问题转化为图论问题。现在对该问题建模:从n到0每个数字代表每个结点;如果两个数字相差一个完全平方数,则在两结点之间建立一条...原创 2020-03-06 20:45:02 · 189 阅读 · 0 评论 -
leetcode#199. 二叉树的右视图
题目链接题目描述:给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释:解题思路执行用时,内存消耗相差无几BFS用队列实现。根据队列先进先出的特点,每一层最后一个结点即为最右端点。所以,只需在遍历的同时,获取每一层倒数第一个结点即可。DFS用非递归...原创 2020-03-06 04:07:14 · 240 阅读 · 0 评论 -
leetcode#103. 二叉树的锯齿形层次遍历
题目链接题目描述:给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。实例:例如:给定二叉树 [3,9,20,null,null,15,7]返回锯齿形层次遍历如下:[[3],[20,9],[15,7]]解题思路 本题要求在常规的队列+BFS基础上进行“之字形”遍历。说明我们要对BFS的过程做出一些...原创 2020-03-05 23:15:46 · 182 阅读 · 0 评论 -
腐烂的橘子
题目链接题目描述:在给定的网格中,每个单元格可以有以下三个值之一:值 0 代表空单元格;值 1 代表新鲜橘子;值 2 代表腐烂的橘子。每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。实例:输入:[[2,1,1],[1,1,0],[0,1,1]]输出:4提示:1 <...原创 2020-03-05 02:07:29 · 184 阅读 · 0 评论 -
leetcode#341.扁平化嵌套列表迭代器
题目链接题目描述:给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。列表中的每一项或者为一个整数,或者是另一个列表。实例:输入: [[1,1],2,[1,1]]输出: [1,1,2,1,1]解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]。理解题意 本题要求设计...原创 2020-03-04 21:13:48 · 165 阅读 · 0 评论 -
模拟系统栈的二叉树非递归遍历
来自leetcode原题二叉树前序遍历、中序遍历、后续遍历声明: 有别于教科书的经典非递归实现方式,本文采用模拟系统栈的方式实现非递归,目的是有助于理解递归与栈的紧密关系。并且,三种遍历的代码形式类似,而经典非递归在后序遍历部分较之前两者有很大差异且不易理解。前序遍历struct TreeNode { int val; TreeNode *left; TreeN...原创 2020-03-04 17:26:04 · 168 阅读 · 0 评论 -
leetcode题解--#86.分隔链表
题目链接题目描述:给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。实例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5题解: 乍一看本题和快速排序的切分过程有些类...原创 2020-02-28 19:25:36 · 202 阅读 · 0 评论 -
leetcode题解--#83.删除排序链表中的重复元素
题目链接题目描述:给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。实例:输入: 1->1->2->3->3输出: 1->2->3题解: 本题比较简单,主要考察移动链表指针操作,使用单个指针移动判重即可。设置当前指针cur,如果cur->val与cur->next->val相等,则说明需要判重,即执行删除指针操作;...原创 2020-02-28 12:37:46 · 249 阅读 · 0 评论 -
leetcode题解--#202.快乐数
题目链接题目描述:编写一个算法来判断一个数是不是“快乐数”。一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。实例:输入: 19输出: true解释:12 + 92 = 8282 + 22 = 6862 + 82 = 10012 + ...原创 2020-02-20 12:14:53 · 242 阅读 · 0 评论