Leetcode题目
文章平均质量分 83
Einskai216
这个作者很懒,什么都没留下…
展开
-
粉刷房子3
问题描述在一个小城市里,有 m 个房子排成一排,你需要给每个房子涂上 n 种颜色之一(颜色编号为 1 到 n )。我们将连续相同颜色尽可能多的房子称为一个街区。(比方说 houses = [1,2,2,3,3,2,1,1] ,它包含 5 个街区 [{1}, {2,2}, {3,3}, {2}, {1,1}] 。)给你一个数组 houses ,一个 m * n 的矩阵 cost 和一个整数 target ,其中:houses[i]:是第 i 个房子的颜色,0 表示这个房子还没有被涂色。已经被..原创 2021-05-05 00:52:19 · 216 阅读 · 0 评论 -
leetcode 685:去除有向图的冗余连接
题意现在有一个N个点,N条边的有向图,每个节点至少与一条边相连,现在要求删掉一条边,使得有向图成为一棵树,从而可以从一个根节点遍历到其他节点(可能出现多个符合条件的答案,要求去除最后一次出现的边)题解大方向:并查集冗余会出现于什么情况?情况1:一个节点有两个父亲,比如输入边集:[[1,2], [1,3], [2 3]]情况2:一条边的加入导致循环,比如输入边集:[[1,2], [2,3], [3,4], [4,1], [1,5]]如何根据冗余情况找到冗余边?原创 2020-09-17 13:37:37 · 459 阅读 · 0 评论 -
leetcode 679: 24点(普通回溯)
题意给出若干个数字组成的数组,判断该数组中的所有元素经过加减乘除之后,是否可以拼凑成24点实现难点1:遍历所有可能的加减乘除组合实现1:每次取出列表中的两个元素进行操作,得到结果之后,加入列表尾部,因为有四则运算,所以这里要回溯四种列表,每次回溯的时候把上一次操作的结果剔除。难点2:效率提升,乘法和加法满足交换律,不需要重复匹配实现2:二重循环的时候,如果是加法或者乘法,判断i>j是否成立,如果成立,由于i<j的时候已经操作过一次了,因此此时可以跳过。注意,每原创 2020-08-23 00:30:01 · 603 阅读 · 0 评论 -
leetcode 31: 下一个排列(数形结合)
题解题目:给定一个数组,将里面的数字重新排列,求比当前数组中数字连起来的字典序大的最小的排列,比如[1,2,3,4] -> [1,2,4,3] -> [1,3,2,4]。。。,如果已经是最大了,那么就返回最小的字典序,如4,3,2,1 -> 1,2,3,4题解:字典序小,意味着第越大的数字在越后面,因此最小的排列就是从头到尾都是升序的,比如,1,2,3,4,最大的排列就是从头到尾降序,4,3,2,1。经过仔细的思考,我们可以下定结论,在不同前缀的情况下,前缀越大,字典序越大。在原创 2020-07-12 15:08:52 · 197 阅读 · 0 评论 -
leetcode 32: 最长有效括号(栈方法 和 双指针追逐法)
最长有效括号匹配题解括号匹配充要条件(规律)规律1:在一段长度以内,左右括号数量是相同的规律2:直到最后一个字符为止,每一个前缀的左括号数量都大于右括号的数量题解框架将字符串分割为一系列字串,确保每一段都不会破坏规则题解思路根据规律2,确保当前子串的前缀是左括号更多。我们可以一个个字符串向后遍历,使用一个计数器cnt统计左右括号的差值,当遇到左边括号计数器就+1,右边就-1,cnt<0的时候说明当前子串再向右就一定不合法了,因为至少有一个前缀是不符合规律2的。原创 2020-07-04 12:33:13 · 231 阅读 · 0 评论 -
剑指offer 33:二叉搜索树后序遍历判断(非递归:反向遍历+单调栈, 递归:找到左右子树)
题解题意:输入一个字符串,判断一下这个字符串是否满足一个二叉搜索树后序遍历的结果题解:非递归:后序遍历的顺序是,left-right-root,这个性质决定了,无论对于树本身,还是子树结构而言,跟节点一定是对应树的后序遍历的最后一位。因为是最后一位,我们可以考虑反向遍历数组,那么此时,遍历顺序就是root - right - left对于二叉搜索树而言,确定了根节点可以帮我们判断左右子树节点的划分位置,即当根节点的值小于某个节点的数据,且大于另一个相邻节点的数据的时候,说明此时从右子树走向原创 2020-07-02 23:16:36 · 202 阅读 · 0 评论 -
leetcode 124. 二叉树中的最大路径和(巧妙的后序遍历)
题解给定一个非空二叉树,返回其最大路径和。 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。样例:经过 最长路径是15+20+7=42题解:此题其实有点像动态规划,主要就是从子节点到父节点的一个状态变化记录,而这个变化正好符合后序遍历的规范这里我们需要考虑最大路径和的意义**路径和:**从一个节点到另一个节点的权重之和,途中不一定经过跟节点遍历:一个节点到另一个节点的路径遍历对于树结构来说是无法实现的,因此我们必须从根出发,而左原创 2020-06-21 23:32:46 · 339 阅读 · 0 评论 -
leetcode 494:目标和(背包)
题解:题意:给定一串数字nums[] 和一个目标值s,在相邻两个数字之间添加+和-号,输出满足nums中的数字进行加减操作之后和为s的方案题解:动态规划,背包问题(最优解不用开二维数组,但是开了更好理解)状态表示dp[i][j]: 表示第i个数字“使用”了之后,截至第i位目标和为j的组合数状态变更:减去当前数字:dp[i][j-nums[i]] += dp[i-1][j]加上当前数字:dp[i][j+nums[i]] += dp[i-1][j]实现,注意,这题j最大值是1原创 2020-06-17 00:19:17 · 190 阅读 · 0 评论 -
剑指offer19: 正则表达式匹配(序列DP)
题解题意:给定一个正常字符串S以及一个正则字符串P,判断两者是否表示相同的字符串,其中S只包含普通字符,P中可能包含三种类型字符,分别是普通字符, .(匹配任意一个普通字符), *(匹配前面一个字符任意次,包括0次)题解: 分类讨论, 我们利用i, j表示S和P当前位置的字符,假设两者长度分别是n和m若P[j] != . && p[j] != *,那么判断S[0~i]==P[0~j]就转换为S[0~i-1]和P[0~j-1],否则说明直到当前位置的两个字符串是不匹配的若P[j]=原创 2020-06-13 12:10:39 · 240 阅读 · 0 评论 -
剑指offer46. 把数字翻译成字符串(斐波那契数列)
题解题意:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。现在给定一个输入是一个int数字num,编程计算一个数字有多少种不同的翻译方法。输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”题解:这题和斐波那契数列有点类似,为了方便,我们利用num[i]表示第i位数字当nu原创 2020-06-09 01:09:12 · 237 阅读 · 0 评论 -
Leetcode 990. 等式方程的可满足性(并查集判断是否处于同一连通分量)
题解题意:给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。判断关系数组中的所有字符串是否能够形成一个合理的方程式: 比如,输入["a==b","b==c","a==c"],输出true,输入["a==b","b!=c","a==c"],输出false题解:这题关键在于分开遍历==和!=所对应的方程式,如果一个等式全都是不等式或者等式,那么这个逻辑一定是正确的。因此只需要考虑同时存在原创 2020-06-08 10:45:55 · 316 阅读 · 0 评论 -
剑指offer 29. 顺时针打印矩阵(模运算模拟转向,思路清晰)
题解题意:给定一个矩阵,要求从外围内内围顺时针打印里面的每一个数据。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]题解:这题我们使用一个指针模拟顺时针的顺序,因此需要注意到什么时候指针要换方向。从左上角开始,顺时针移动的方向有哪些?右 - 下 - 左 - 上,因此可以利用两个数组来表示这几个方向dy[]={1,0,-1,0}, dy[] = {0,1,0,-1},然后移动就是nx = x + dx[x], n原创 2020-06-05 09:54:50 · 137 阅读 · 0 评论 -
Leetcode 238. 除自身以外数组的乘积(左右扫描)
题解题意:给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 res,其中 res[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。输入: [1,2,3,4]输出: [24,12,8,6]题解:想要题目的意思,我们可以考虑对每个数字求它左边和右边的数据的乘积。因此最直观的做法就是利用一个L数组保留第i个数字之前的所有数字的乘积,利用R数组保留第i个数字之后所有数字的乘积,然后再遍历一次,让res[i]=L[i]*R[i]即可实现class原创 2020-06-04 11:20:41 · 163 阅读 · 0 评论 -
837. 新21点(概率DP)
题解题意:题目是一个摸牌游戏,牌的数字都在某个范围内,规则是玩家一直摸牌,当累计数值比预先给定的阈值大的时候,就停止摸牌,加上最后一个数值之后,如果大于一个目标值那么就算输,否则,就算赢。 现在给定三个数字,N, K, W,N是目标值,W是牌的最大数值,换句话说就是牌堆的数值都在[1,W]范围内,K是给定的阈值,即累计数字大于K的时候停止摸牌,求玩家赢的概率。K<=N<=10000,W<=10000K<=N<=10000, W<=10000K<=N<=10原创 2020-06-03 12:44:38 · 464 阅读 · 0 评论 -
Leetcode 84: 柱状图中的最大矩形(扩散+单调栈)
题解题意:给定数组heights[],包含n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积,矩形中间不能为空,样例,给定数组heights = [2,1,5,6,2,3], 输出10,即阴影部分的面积:题解:首先考虑什么情况下可能围成最高的矩形?自然是要么够宽,要么够高,但是这两个并没有依赖性,因此需要共同考虑,而暴力做法在有两个自由变量的时候,复杂度都是O(n2)O(n^2)O(n2),不合适,我们要考虑如何减少没必要的状原创 2020-05-30 12:31:27 · 320 阅读 · 0 评论 -
Leetcode 198, 213, 337:打劫家舍系列
题解打劫家舍 1(01背包)题意:村里的房屋成一字排列,现在给定一个数组nums里面每个数据代表对应编号房屋中的财产。有一个强盗想在这个村庄中打劫,但是如果连续打劫两家相邻的房屋,会导致系统报警,请设计一个算法,在不出动警报的情况下让强盗获取最大金额题解:很直接的01背包问题,因为要表示最大值,我们首先考虑针对每个房屋的状态表示。我们可以利用dp[i]表示第i家房屋之前,最多能够打劫多少金额,那么如果下次打劫如果用上了dp[i],就不用考虑i之前的状态了。现在考虑dp[i]是如何通过上一个状态转原创 2020-05-29 11:44:44 · 368 阅读 · 0 评论 -
394. 字符串解码(辅助栈+字符串栈)
题解题意:字符串的编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 给定一个经过编码的字符串,返回它解码后的字符串样例s = “3[a]2[bc]”, 返回 “aaabcbc”.s = “3[a2[c]]”, 返回 “accaccacc”.s = “2[abc]3[cd]ef”, 返回 “abcabccdcdcdef”.题解:无疑,越是嵌套在里面的括号,要被重复的次数就越多,一定是越里层括号原创 2020-05-28 12:05:33 · 197 阅读 · 0 评论 -
leetcode 974:和可被k整除的子数组(同余定理+哈希记录)
题解题意:给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。其中k<=10000, A.length <= 10000题解:连续非空的元素之和,最容易想到的就是求前缀和,利用pre[r]-pre[l]的方式得到区间内满足条件的子数组和。然而前缀和遍历所有情况需要o(n^2)的复杂度,因此,很多情况下,包括此题,这都是不可能直接做的,因此我们需要表示状态,然后进行状态的压缩整除的状态:一般而言,只要是要求不能遍历所有数据的,都是存在一个规律使得不需要遍历所原创 2020-05-27 11:27:36 · 459 阅读 · 0 评论 -
leetcode 287. 寻找重复数(数组中的快慢指针)
题解题意:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。要求时间复杂度是o(n)且额外空间复杂度只能是o(1)题解:在介绍此题之前,先介绍一个非常相似的题目:数组中重复的数字数组中的重复数字数组中重复的数字:一开始看错题,以为思路和这个一样。此题是利用原地桶排序的思想,因为数组中的数据范围都在(0,n-1),小于等于数组的长度,那么如果每个元素不重复,那在正常排序原创 2020-05-26 15:18:37 · 415 阅读 · 0 评论 -
Leetcode 146:LRU缓存机制(哈希+双向链表,终于自己写出来了没bug的版本)
题解设计和实现一个 LRU (最近最少使用) 缓存机制,(如果不懂LRU机制的,需要先学习操作系统的LRU调度算法,先从理论上知道实现方式才行),支持以下操作: 获取数据 get 和 写入数据 put ,且两个操作都需要在O(1)复杂度下完成LRU算法大意:给定一个固定大小的容器,容器中的事物代表需要使用的事物,以及一系列事物,每个事物都有自己的key, value值,其中key用来识别自身的身份,value则是内容。在容器没有满的时候,事物会不断向容器里面添加,容器满的时候,就把最早添加到容原创 2020-05-25 11:44:01 · 206 阅读 · 0 评论 -
Leetcode 4. 寻找两个正序数组的中位数 (数组划分+中位数位置搜索)
题解题意:给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。题解:此题主要是找到两个数组的中位数位置,不断地在两个数组中寻找合理的分割线位置。中位数位置:(m+n)偶数:(m+n+1)/2的左右两边,m+n奇数:(m+n+1)/2所处元素。对于奇数来说,就是划分成两堆数据之后,奇数长度数组的中位数就在元素多一个的那边(如9个元素,划分成5+4,中位数就在5那一堆)在两个数组原创 2020-05-24 12:24:38 · 337 阅读 · 0 评论 -
Leetcode 76. 最小覆盖子串(滑动窗口+文本距离)
题解题意:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串,顺序可以不一样。如果S并没有包含T的子串,那么返回"",否则,样例的S只会包含唯一的一个最短覆盖子串。T中可能包含重复字符,比如输入: S = “ADOBECODEBAANC”, T = “AABC”输出: “BAANC”题解:这题思路其实比一些中等题目简单(当然我是看题解才做出来的),查找字符串字串的题型考的最多的就是双指针滑动窗口的思路,但是这题还有一个点在于使用汉明距离来表示两个两原创 2020-05-23 14:49:59 · 245 阅读 · 0 评论 -
Leetcode 105:前序与中序遍历序列构造二叉树(递归+哈希提升效率)
题解题意:根据一棵树的前序遍历与中序遍历(所有节点的数值唯一)构造二叉树。如给定前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回 3/ \9 20 / \ 15 7题解:我们知道前序遍历是根-左-右的顺序进行的,而中序遍历是左-根-右的顺序。两个遍历对确认节点的位置各有帮助,是两个工具序列其中,前序遍历用于找到根节点的位置,因为对于任何一颗子树的前序遍历,根节点都是第一个原创 2020-05-22 11:34:56 · 163 阅读 · 0 评论 -
leetcode 5: 最长回文子串(中心扩展算法)
题解题意: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。题解:虽然长度是1000,但是如果暴力求每个子串的翻转来判断,那似乎是O(n^3)的复杂度,因此不可取。个人认为中心扩展算法是解决最长回文子串问题的最容易掌握的方法,这种算法时间复杂度是O(n^2),空间复杂度是O(1)(但是不是复杂度最优的算法,最优的算法是Manacher算法,时空复杂度都是O(n),但是比较复杂,需要经常看才能掌握)中心扩展算法:巧妙的利用了回文串的特点,就是从中心到两原创 2020-05-21 10:28:15 · 283 阅读 · 0 评论 -
leetcode 1371. 每个元音包含偶数次的最长子字符串(哈希+状态压缩表示)
题解题目:给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:子串中包含的元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。(字符串长度最大是 5*10^5)题解:最简单的做法就是两重循环,遍历所有子串,但是这明显是不行的,因为数据长度限制了O(n^2)的做法。那么如何优化复杂度,官方题解给了两个方向。状态记录:使用二重前缀和pre[i][k]:保留第i个字符前面的字符串中,第k个元音字符出现的次数,这样一来,每个字符出现的次数就可以通过pre[r原创 2020-05-20 12:27:53 · 257 阅读 · 0 评论 -
leetcode 152: 最大乘积数组(动态规划)
题解题意:给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。题解:此题要求找到连续乘积最大的子数组,连续数组的意义是什么,一个最直观的想法就是,如果前面的乘积在乘了元素i之后变大了,那么就把元素i加入到子数组中,否则,则从第i项开始,再进行记录。但是这会遇到一个问题,正数如果乘以负数,那么就是变小了,此时如果抛弃掉前面的项,很明显是不对的,因为后面如果又遇到一个负数,那么最小值又变成最大值了,因此我们不能因为乘以了一个负数,原创 2020-05-18 11:19:58 · 237 阅读 · 0 评论 -
leetcode 210. 课程表 II(拓扑排序)
题解题目:在选修某些课程之前需要一些先修课程。 例如,想要学习课程0,你需要先完成课程1。我们用一个匹配来表示他们: [1,0]。例子,给定一个数字代表课程总量,以及n对数据,前者代表要学课程, 后者代表基础课程,4, [[1,0],[2,0],[3,1],[3,2]]。题解:拓扑排序,很简单的想法,根据需求关系建立一个有序拓扑图,首先将入度为0的点找出来,然后将相邻节点的度数减1,如果相邻节点的度数为0了,就加入到队列中,循环这个过程,直到队列是空的。class Solution {原创 2020-05-17 12:50:42 · 198 阅读 · 0 评论 -
leetcod 25:K个一组反转链表(思路很直接,但是处理细节较多的hard题)
题解题目:给定链表的头和整数k,k小于链表长度,要求对链表中每k个节点进行一次翻转,如示例所示题解:这题是翻转链表的拓展版。主要思路:针对每个长度为k的子链(简称k链)进行一个翻转,将前一个k链的末尾节点连接上下一个k链的开头节点。首先是如何找到k链,方法有不少,但是最实用的方法就是设置头指针和尾指针,尾指针指向第k个节点即可。找到k链之后,就是进行翻转操作,这里使用头插法,链表翻转就不多介绍了。然后就是讨论如何连接上一个k链和下一个k链的问题了。这个问题主要涉及到两个节点,一个是上一个k原创 2020-05-16 15:34:53 · 175 阅读 · 0 评论 -
leetcode :三数之和系列(排序+双指针+去重)
相关的题解leetcode 15 三数之和:给定一个数组nums,找出数组里面三个数字之和为0的组合,组合不能重复题解:先给数组排好序,然后固定最左边的数(i)。然后在右边数组中找两个数字, 看是否满足情况,此时就运用到了双指针算法。设置两个指针j,k,j指向i右边的第一个数字(j=i+1),k另一个指向数组的最后一个数字k=nums.length-1,分别代表三数中的中间值和最大值如果此时nums[i]+nums[j]+nums[k]>0说明k太大了,执行k--如果此时nums[i]原创 2020-05-14 18:40:11 · 222 阅读 · 0 评论 -
一种简单的记忆方法:关于二分查找upper_bound和lower_bound
一种从结果看结论的方法,好记但是不严谨上下界的区别主要是向左还是向右逼近目标值,让我们来看看是如何实现的上界 int upper_bound(int arr[], int target){ int n = sizeof(arr)/sizeof(int); int l = 0, r = n-1; while(l<r){ int mid = (l+r+1)>>1; if(arr[mid] <= target) l = mid; else r =原创 2020-05-14 17:44:34 · 405 阅读 · 0 评论 -
leetcode 1287: 有序数组出现次数超过25%的元素(神烦二分查找上下界)
题解题意:给定非递减整数数组arr, arr中恰好有一个整数,它的出现次数超过数组元素总数的 25%。题解:最简单的就是利用双指针设置一个0.25*arr.length大小的窗口,一位位往后遍历,这个几行代码就可以实现,O(n)。我们再看看题目,题目告诉我们,数组是排好序的,既然是因为数组是排好序的,就可以考虑二分法计数法。二分法计数是因为二分查找有两种,一种是找到重复数字第一次出现的位置,另一种是找到重复数据最后一次出现的位置,这也成为lower_bound和upper_bound查找法。这题原创 2020-05-13 21:46:27 · 258 阅读 · 0 评论 -
leetcode 456: 132模式 (前缀最小值+单调栈)
题解题意:给定数组a1, a2, …, an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak < aj。 给定数组nums[],判断是否有132模式题解:此题主要是找到一个下标最大的中间值,下标最小的最小值,和下标中间的最大值。下标最小的最小值最好找,就是从前往后遍历一遍数组,第j个位置的最小值就是以j为末尾元素的前缀数组的最小值, 因此首先用一个min数组来记录到第j个数字之前出现的最小值下标最大的中间值则可以通原创 2020-05-12 10:33:36 · 382 阅读 · 2 评论 -
leetcode 50: 快速幂(非递归与递归)
题解题意:实现函数pow(x,n),其中x是double类型,n是int类型(n是)除了快速幂算法之外,还要注意int类型的正负号取值范围不一样。题解:快速幂算法(分治思想)举两个例子,求x64x^{64}x64, 和x10x^{10}x10x2=(x∗x)→x4=(x2)∗(x2)→x8=(x4)∗(x4)∗x→x16=x8∗x8→x32=x16∗x16→x64=x32∗x32x^2 = (x*x)\to x^4 = (x^2)*(x^2) \to x^8 = (x^4)*(x^4)原创 2020-05-11 10:29:38 · 234 阅读 · 0 评论 -
leetcode 236: 二叉树的最近公共祖先(面试常考)
题解题意:给出一个二叉树根节点root,以及两个子节点p,q,求p,q的最低公共父节点,如下图,给出节点3,节点6,7要返回5分析:什么叫做最低公共祖先?祖先:如果一个节点的左子树或者右子树包含所需要寻找的两个节点p,q,那么说明左或者右子树中包含了他们的祖先最低祖先:那么什么是最低祖先呢,有两种情况,一种情况是p就是q的祖先,那么最低祖先就是p,如果不是,那么就是当p,q分布在一个节点的左右子树的时候,就是这个节点就是最低祖先,因为无论递归左子树还是右子树都会失去一个。方法1:原创 2020-05-10 12:00:11 · 203 阅读 · 0 评论 -
leetcode 69: x的平方根(三种方法)
题解袖珍计算器x^1/2 = (e^lnx)^1/2 = e^(1/2lnx)转换成求lnx,感觉没有什么提升,都用了内置函数,还不如直接调用sqrt二分查找 public int mySqrt(int x) { long i = 1, j = x, ans = 0; while(i<=j){ long mid = (i+j)/2; if(mid*mid <= x) { ans原创 2020-05-09 11:23:16 · 243 阅读 · 0 评论 -
Leetcode 221. 最大正方形(动态规划)
题解题意:在一个01矩阵matrix[][]中,找到全是1的最大正方形。题解:不难想到,(i, j)位置为右下角的正方形面积是由上一个状态的正方形决定的,因此比较容易想到是动态规划的做法,利用dp[i][j]维护位置(i,j)为右下角的正方形的边长状态 ,那么状态转换方程是什么,似乎不是很直观就可以得到,但是有一个最直观的状态,就是matrix[i][j]=0,那么dp[i][j]=0...原创 2020-05-08 11:47:27 · 223 阅读 · 0 评论 -
leetcode 572: 另外一颗树的子树(DFS)
题解题意:给定两颗树的根节点,s,t,判断t所表示的树是不是s所表示的树的子树题解:总共三种情况,要么s树等于t树,要么s树的左子树等于t树的左子树,要么s树的右子树等于t树的右子树,如果s树遍历完了都没找到t树重合的子树,那么说明没有同样的实现,java递归效率为什么比C++高这么多?C++版本class Solution {public: bool dfs(Tre...原创 2020-05-07 10:08:04 · 186 阅读 · 0 评论 -
leetcode983 每日一题:最低票价(动态规划)
题解题目大意:旅游规划,给出数组days, days中的数据小于365,要求days给出的日期都能旅行,days中的日期是单调递增的。旅社有三种方案供选择,分别是1日游,7日游,30日游,三种价格记录在cost数组中,价格不一定从低到高输出:覆盖所有days的旅行最少需要多少钱题解:不难发现,每个日期的价格取决于上一次价格的开销+这次的票价,因此是动态规划问题状态转移:...原创 2020-05-06 11:37:22 · 277 阅读 · 0 评论 -
leetcode 310:最小高度树
题目题目:对于一个具有树特征的无向图,我们可选择任何一个节点作为根,在所有可能的树中,具有最小高度的树被称为最小高度树。输入:无向图输出:最小高度树根节点链接leetcode 310题解多起点拓扑排序,从所有叶子节点开始,一层一层的删除节点(每次把一层的所有叶子节点的相邻节点的入度-1),最后剩下的入度<=1的节点都可以作为根节点。最后剩下几个根节点?一定...原创 2020-04-08 18:05:53 · 133 阅读 · 0 评论 -
二叉树题目:验证搜索二叉树(leetcode 98)
中序遍历二叉搜索树的中序遍历可以形成有序数组,最暴力的做法就是将遍历的数据存储起来,再进行判断。vector<int> v; void inner(TreeNode* root ){ if(!root) return; inner(root->left); v.push_back(root->val); ...原创 2020-05-05 13:39:13 · 140 阅读 · 0 评论