![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
经典OJ
经典OJ
RanieMiss
只有不断的学习,人生才会更有意义
展开
-
leetcode.99 恢复二叉搜索树(Medium)
题目描述:题目分析:二叉搜索树的其中一个特点就是中序遍历出来的序列是有序的,如果在二叉搜索树中出现了错误的结点,那么在中序遍历中一眼就可以看到。所以解决问题的策略就是在中序遍历中解决问题。既然题目说有两个结点的值发生了交换,那么我们就要找出这两个结点并记录下来,最后再交换这两个结点的值。于是我们要定义两个指针用于记录发生交换的指针,另外还需要一个指针记录上一个结点用于与目前遍历的结点进行比较。题目代码:...原创 2022-03-05 16:18:11 · 210 阅读 · 0 评论 -
leetcode.22 括号生成(Medium)
原创 2022-01-12 22:27:10 · 217 阅读 · 0 评论 -
leetcode.37 解数独(Hard)
原创 2022-01-12 21:58:32 · 182 阅读 · 0 评论 -
leetcode.239 滑动窗口最大值(Hard)
题目分析详见注释原创 2022-01-11 11:24:38 · 189 阅读 · 0 评论 -
leetcode.496 下一个更大元素(Medium)
进阶:你可以设计一个时间复杂度为 O(nums1.length + nums2.length) 的解决方案吗?利用单调栈和哈希表解决问题:原创 2022-01-08 15:00:52 · 155 阅读 · 0 评论 -
leetcode.297 二叉树的序列化与反序列化(Hard)
这一题的难点在于,怎样解决节点值为两位及两位以上的值的序列化和反序列化问题,不能单单的直接将 root->val + ‘0’ 和 data[i] - ‘0’ ,例如 -13 + ‘0’ 是65而不是13,所以在序列化时要对其每个值用分隔符进行分隔,将值序列化采用to_string,反序列化采用stoi,反序列化时根据分隔符的划分,取到分隔符之间的字符串就是这个结点的值。...原创 2022-01-08 14:00:44 · 72 阅读 · 0 评论 -
leetcode.222 完全二叉树的结点个数(Medium)
分析:如果像普通二叉树一样的递归遍历,时间复杂度是O(N),如果还要降低时间复杂度,可以先判断该树是不是满二叉树,如果是满二叉树,直接通过公式计算其节点个数,如果不是满二叉树,在进行普通递归。这样可以把时间复杂度降到O(logN*logN)。...原创 2022-01-08 12:18:54 · 203 阅读 · 0 评论 -
leetcode.450 删除搜索二叉树中的结点(Medium)
删除搜索二叉树中的结点迭代法:原创 2022-01-08 11:00:17 · 169 阅读 · 0 评论 -
leetcode.98 验证二叉搜索树(Medium)
单单简单靠root的左结点值小于root的值,root的右结点值大于root的值是不够的,二叉搜索树的定义是root的值要大于左树所有的值,小于右树所有的值。所以在递归的时候要明确区间,当左树的值应该都要小于root的值,就可以把root的值当作左子树恰好不能容忍的值,当左子树的值大于等于root的值,那么就不是BST;反之在右子树,右子树的值应该都要大于root的值,所以把root的值当作右子树恰好不能容忍的值。...原创 2022-01-07 22:00:51 · 155 阅读 · 0 评论 -
leetcode.198 打家劫舍I,II,III(Medium)
动态规划分析:一、dp数组的定义:dp[i] 表示从第i间房间开始选择,能得到的最多金钱数。二、base case:dp[n] = 0, 因为不存在这样一个房间。三、状态转移:到了这一间房间,要么选择,要么不选。如果选择了,那么就得拿走这间房间的然后前往下一家相隔的房间。四、我们要的结果就是dp[0],从第0个房间开始选择。...原创 2022-01-06 19:57:15 · 149 阅读 · 0 评论 -
leetcode.416 分割等和子集(Medium)
动态规划分析:这是一个子集背包问题。想要知道有没有两个相等的子集,可以把问题分割成有没有一个子集的和等于整个数组和的一半。所以这样就可以转化成一个背包问题。一、对dp数组进行定义:对于前i个数,是否存在子集的和等于j,如果存在,那么dp[i][j] = true,如果不存在,dp[i][j] = false。二、base case:当i为0时,没有数给我们做子集,这时不可能凑出j。当j为0时,任何时候都满足,因为任何时候背包都是空的。三、状态转移方程:对于dp[i][j] 有两种选择,一种是放,一.原创 2022-01-06 18:23:08 · 63 阅读 · 0 评论 -
leetcode.312 戳气球(Hard)
动态规划分析:首先可以将这个问题分解成最大硬币数 = 戳破最后一个气球得到的硬币数+戳破所有该气球左边的所有气球得到的所有硬币数+戳破所有该气球右边的所有气球得到的所有硬币数。题目中说可以将超过数组边界的气球看作是一个硬币的气球。所以我们可以模拟出一个新的数组,新数组比原数组长2,将数组的开头和末尾都存上1。一、dp[i][j] 的含义:戳破i 与 j之间的所有气球所得到的最多硬币数。那么题目中要求的结果就是dp[0][n+1]。二、base case:当 i == j 或 i+1 == j时,中.原创 2022-01-06 14:28:47 · 160 阅读 · 0 评论 -
leetcode.887 鸡蛋掉落(Hard)
原创 2022-01-06 13:16:50 · 474 阅读 · 0 评论 -
leetcode.10 正则表达式匹配(Hard)
动态规划分析:针对与正则匹配的问题,无非就是用双指针进行逐个匹配,如果通配符的指针走到结尾,而匹配串的指针也走到结尾了,代表匹配成功了。而如果匹配串的指针先走完了,这时要看通配符剩下的是不是x* y* z* 的这种情况,因为x* y* z* 可以匹配空字符。要想一一开始匹配,首先需要一个dp函数。代码逻辑:首先从一个字符的位置开始匹配,用i代表匹配串的要匹配的字符的下标,j表示通配符串的要匹配的字符的下标。s表示匹配串,p代表通配串。一、当s[i] == s[j] 或者 p[j] == ‘.’ 时,.原创 2022-01-06 10:36:15 · 115 阅读 · 0 评论 -
leetcode.1312 让字符串成为回文串的最小插入次数(Hard)
动态规划分析:一、dp数组的含义:dp[i][j] 的含义是从字符串的 s[i … j]成为回文串的最小插入次数。二、base case :单个字符构成的字符串本来就是回文串,所以最小的插入次数是0。三、状态转移方程:当s[i] == s[j] 时,左右对应刚好满足回文,这时 dp[i][j] = dp[i+1][j-1] +2 。如果不相等,那么最小的插入次数应该是分别只插入一个字符时的次数加上一(从左插入和从右插入,对应的分别是i 和 j),然后取它们中的最小值作为最小的插入次数。四、我们要的.原创 2022-01-05 21:53:20 · 150 阅读 · 0 评论 -
leetcode.516 最长回文子序列(Medium)
动态规划分析:一、dp数组的定义:dp[i][j]表示从字符串下标的i - j的子串的最长回文子序列的长度。二、base case : 单独字符的最长回文子序列的长度都是1。在dp数组中 i>j 是不合理的。三、状态转移方程:如果字符串s 的 s[i] == s[j] ,那么最长的回文子序列的长度就dp[i][j]就是 dp[i+1][j-1] +2。如果不是相等的,那么 dp[i][j] 就是 dp[i+1][j] 和 dp[i][j-1] 中大的那个。四、我们要的结果就是 dp[0][s.原创 2022-01-05 21:38:36 · 79 阅读 · 0 评论 -
leetcode.72 编辑距离(Hard)
动态规划分析问题:一、确定dp数组的含义:dp[i][j] 是 words1 从0-i的子串与words2 从0-j 的子串的最小编辑距离。二、base case :空串变成任何的字符串最小需要字符串长度的次数。任何的字符串变成空串最少也要字符串长度的次数。(全部插入和全部被删除)三、状态转移方程:如果两个字符串的末尾两个字符相等,那么等于删去这个相等的字符之后剩下的串的最小编辑距离。如果不相等,那么最小的编辑次数是从增加、删除、替换中最小的那个加一。通过dp数组得知,dp数据向右表示增加,向下表.原创 2022-01-05 21:25:52 · 292 阅读 · 0 评论 -
leetcode.1143 最长公共子序列(Medium)
动态规划的思路:只要涉及子序列的问题,十有八九要用动态规划来解决。一、要明确dp数组的含义。因为有两个字符串,所以需要一个二维数组。dp[i][j] 的含义就是字符串1的下标为0到i的子串与字符串2的下标为0-j的字串的最长公共子序列的长度。二、就是要确定好base case。空串与任何串的公共子序列的长度都是0。三、找状态转移方程。我们知道,如果在字符串1与字符串2的末尾都加上一个相同的字符,那么它们的最长公共子序列的长度就会增加1。如果加上的字符不相同,那么dp[i][j] 的值应该是某些值的一.原创 2022-01-05 20:58:16 · 231 阅读 · 0 评论 -
leetcode.53最大子数组和(Easy)
原创 2022-01-05 20:39:43 · 242 阅读 · 0 评论 -
leetcode.5 最长回文子串(Medium)
原创 2022-01-04 21:54:48 · 222 阅读 · 0 评论 -
leetcode.300 最长递增子序列
解法一:经典动态规划解法二:二分法原创 2021-12-20 21:40:47 · 65 阅读 · 0 评论 -
剑指.38 字符串的排列
解法同 leetcode 46 47原创 2021-12-14 19:12:05 · 53 阅读 · 0 评论 -
leetcode.3无重复字符的最长子串
原创 2021-12-14 18:38:01 · 107 阅读 · 0 评论 -
leetcode.438 找到字符串中所有字母异位词
原创 2021-12-14 18:20:57 · 182 阅读 · 0 评论 -
leetcode.567 字符串的排列
原创 2021-12-14 18:11:21 · 61 阅读 · 0 评论 -
leetcode.76 最小覆盖字串
原创 2021-12-14 17:47:40 · 56 阅读 · 0 评论 -
leetcode.142 环形链表II
原创 2021-12-14 16:26:06 · 304 阅读 · 0 评论 -
leetcode.752 打开转盘锁
version1version2原创 2021-12-13 17:57:30 · 163 阅读 · 0 评论 -
leetcode.46、47 全排列
原创 2021-12-13 12:18:53 · 151 阅读 · 0 评论 -
leetcode.51 N皇后
最基本回溯解法:原创 2021-12-13 13:38:22 · 146 阅读 · 0 评论 -
leetcode.111 二叉树最小深度(深度优先与广度优先)
深度优先(DFS):广度优先(BFS):BFS空间复杂度较高,DFS空间复杂度较低。它们最坏的时间复杂度相同都是O(N),但在本题在纵向上找最小高度,BFS是比DFS高效的。原创 2021-12-13 14:24:59 · 83 阅读 · 0 评论 -
leetcode.322、518 零钱兑换、零钱兑换II
动态规划:动态规划:对上述动态规划进行压缩:原创 2021-12-12 18:34:00 · 133 阅读 · 0 评论 -
leetcode.124 二叉树中的最大路径和 C++解法
原创 2021-12-12 17:15:25 · 466 阅读 · 0 评论 -
剑指.36二叉搜索树与双向链表
原创 2021-12-12 15:53:38 · 48 阅读 · 0 评论 -
leetcode.105、106 从前序与中序遍历序列构造二叉树与从中序与后序遍历序列构造二叉树
从前序与中序遍历序列构造二叉树从中序与后序遍历序列构造二叉树原创 2021-12-12 15:50:07 · 47 阅读 · 0 评论 -
leetcode.144、94、145 二叉树前、中、后序的非递归遍历 C++解法
非递归前序遍历非递归中序遍历非递归后序遍历原创 2021-12-12 14:03:30 · 393 阅读 · 0 评论 -
leetcode.107 二叉树的层序遍历II C++解法
题目分析:该题和一般的层序遍历不一样的是需要分清每一层的数据并将每一层的数据分别存到一个vector中,所以需要一个参数levelSize来控制每一层数据的个数。用队列来保存结点,对每层的数据处理levelSize次就可以很好地解决这个问题。最后再逆置以下数组就可以了。解法:...原创 2021-12-12 12:44:43 · 567 阅读 · 0 评论 -
leetcode.236 二叉树的公共祖先 C++解法
题目分析:如果该题的二叉树是三叉链的形式很好解决,只需要沿着parent往上找即可,保存下路径,最后找公共结点。如果这题的二叉树是二叉搜索树,很容易通过二叉搜索树的性质找到该节点,顺便保存路径,找到公共结点。如果是普通二叉树,如果查找的两个结点一个在当前节点的左树一个在右树,说明该节点是公共节点;如果是都在当前节点的左边,则递归到该节点的左子树中查找;如果都是在当前节点的右边,则低轨道该结点的右子树中去查找。解法一:左右查找法(时间复杂度O(N2))解法二:用栈保存路径(时间复杂度O(N)).原创 2021-12-12 12:03:03 · 439 阅读 · 0 评论 -
leetcode.95 不同的二叉搜索树II C++解法
题目描述:解法:递归展开图:原创 2021-12-10 13:02:49 · 207 阅读 · 0 评论