LC 606. Construct String from Binary Tree 二叉树序列化过程可以通过前序遍历实现,我们可以使用递归方法,维护一个全局字符串变量,递归出口当节点为空。每次层递归时,把当前节点加入,然后这道题如果存在左或右子节点时,不管左节点是否为空一定要加入括号。所以查看是否存在左或右节点,如果存在。加左括号然后遍历左子树(不管有没有)遍历结束加入右括号,然后查看右节点是否存在如果存在那么重复左节点操作即可。给定一个二叉树,返回序列化后二叉树结构,要求用括号包含子树信息.
LC 536. Construct Binary Tree from String 给定一个二叉树字符串表达式,用数字代表当前节点括号包含子树例如 2(3)(4),返回整个二叉树。题目字符串只有左右括号以及负号或者数字,且不用考虑invalid括号问题。
LC 199. Binary Tree Right Side View 基本思路就是层级遍历整个树,然后将每一行最后一个元素插入结果。给定一个二叉树,返回从上到下每一行最右边的节点。M为队列中节点数,一般等于单层最多节点的个数。
LC 314. Binary Tree Vertical Order Traversal 给定一个二叉树,将垂直位置上同一列的所有节点整合成一个集合,并按照列的左右位置从左到右返回所有集合,同一列的集合中元素顺序保证,从上到下,从左到右。如果两个节点同行同列,按照从左到右依次返回。
LC 173. 二叉树迭代器 Binary Search Tree Iterator 实现一个BST中序遍历迭代器数据结构,支持问询操作:next() && hasnext()对于二叉树前中后序遍历迭代实现可以参考这篇blog -中序遍历(左根右)整体思路就是先遍历左子树左子节点,在过程中将每一个节点根节点压栈,当左子节点遍历到底后,弹栈得到当前根节点,并继续处理右子树。初始化操作:创建一个栈,并把BST中最小元素也就是最左的节点以及途中经过的节点压入栈中next()操作:我们保证栈顶一定是BST中当前最小节点,弹出栈顶,然后更新第二小节点,也就是。
LC 560. Subarray Sum Equals K 给定一个一维数组求出和为K的所有子序列个数。求一个连续区间内和,可以用到前缀和来快速计算区间和,每一次遍历的时候就找 前缀和(0, i) - 前缀和(0, j) == K的个数也就是找前面前缀和 (0, j)等于 前缀和(0, i)-k的个数,这就转变成two sum问题,遍历时记录用哈希表保存前缀和数值对应前缀个数,然后查看前缀和等于当前前缀和-K的前缀个数,更新结果即可。
LC 174. Dungeon Game 给定一个2D矩阵,每一个格子值有正有负,代表你经过这个位置的buff或者debuff,玩家具备初始生命值X从左上移动到右下(只允许向右或者向下移动),保证经过每一个格子时生命值大于0。问从起点走到终点所需要的最少初始非负生命值是多少。可以采用动态规划进行求解,题目思路和之前Leetcode 64路径和最小类似。这里需要注意的是如何定义一个具有递推关系的状态变量,如果我们dp[i][j]定义为就是错的,因为起点到每一个(i , j)的初始最小生命值,并不具有递推关系。所以可以反过来定义。
LC 2304. Minimum Path Cost in a Grid 注:这道题目moveCost矩阵 moveCost[i][j]代表value==i的点移动到下一层。Leetcode 64题的变种题,只不过节点之间edge有了权重,最后要找到cost和最小的路径。过于暴力,本题依然存在递推依赖关系,我们可以直接使用动态规划求解.如果直接暴力所有所有路径然后找最小时间复杂度需要。
[Leetcode刷题] - LC 62 & 63. Unique Path I & II 题目要求寻找从左上到右下的所有可能路径,求解所有可能的方案,并且路径个数有递推关系,可以使用动态规划。和上一道题类似只不过中间加入障碍物,整体思路类似只是状态转移方程中需要加入一个额外条件,如果。corner cases: 起点也可能被堵。为了节省空间直接在原矩阵上进行递推操作。是障碍物 dp[i][j]归零。额外条件: 如果(左边路径被堵)&& (上边路径被堵)
[Leetcode刷题] - LC64 Minimum Path Sum 题目和思路很类似,都是动态规划入门题。题目求从二维矩阵左上到右下的数值和最小的路径,粗暴的解法可以通过DFS枚举所有路径找到,对着这道题可以求解路径和最小的路径存在递推关系可以使用动态规划。动态规划三要素dpijmindpi−1jdpij−1])gridij。
[题型总结] - 数组排列类问题 整体思路就是先对于数组进行排序,对于相同的数字我们会定义一个顺序,比如[1,1,2] 我们要维护前面两个1的相对位置[1(1), 1(2), 2], 如果前一个1没有使用的时候,不允许使用后一个1。和上一道题类似,还是使用回溯暴力枚举所有可能性,由于有重复值,排序中会存在相同结果,比如[1,1,2] 排列中会出现两次[2,1,1],如果跳过这些重复解。2. 如果当前值与前一个数重复:那么只有前一个数被使用过,并且当前值没有被使用才能加入结果。题目给定一个带有重复数的数组,返回所有不重复的排列方式。
[系统设计总结] - Proximity Service算法介绍 Proximity Service广泛应用于各种地图相关的服务中比如外卖,大众点评,Uber打车,Google地图中,其中比较关键的是我们根据用户的位置来快速找到附近的餐厅,司机,外卖员也就是就近查询算法。
[Leetcode刷题] - 栅栏涂漆DP类问题 为了实现记忆化搜索我们需要改写思路1代码,舍弃全局最小值,而是在递归中不断更新局部最小值, 之前的思路1的代码,我们是向下递归,在到底后更新结果,这样很难缓存重复解。这一类题目通常会问给定一组房子n和一组染料k去涂漆,并且会加入限制条件比如:某种颜色只能使用1次,相相邻房子不能涂同一种颜色,或者最多不能超过连续3个房子涂想通过颜色等等,让我们列举所有可能性总和,带限制条件的排列组合类问题。不难看出,在递归的过程中,存在着很多局部组合是重复的,我们完全可以将这些重复组合缓存起来,从而实现优化剪枝。
[算法总结] - 蓄水池采样算法 在长度为N的数组中,随机等概率选取K个元素,如何实现这个随机算法。思路很简单,生成一个[0, N]的随机数index,然后返回index上的数值即可。但是,如果输入是一个长度未知的数组比如stream,先遍历得到数组大小,在遍历进行K次采样显然不够高效,这就引出了蓄水池算法。上述步骤中最难理解无非就是第三步,为什么这样做就可以实现每一个元素被选的概率是k/N。的元素, 在 k 步之前,他们被选中是没有随机性的 p = 100%;的元素,在k步之前,是没有概率的因为不存在。
[模版总结] - 拓扑排序 拓扑排序是一种特殊排序方式,是以有向无环图中结点依赖关系,将每个结点逐个排序,常见的用例比如Java Springboot的依赖注入机制。拓扑排序只是对有向无环图的一种排序方式有向无环图:图中任何结点无法通过若干边回到该结点有向有环图:图中某个结点可以通过若干边回到该结点。