自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(83)
  • 收藏
  • 关注

原创 LC 378. Kth Smallest Element in Sorted Matrix

如果这一列最后元素比答案大,那么表示这一行后面的元素都比这个答案大,没有遍历的必要,直接向上移动一行继续比较。思考: 如何利用这个行列有序的性质,每一行有序我们可以使用k路归并的思路建立一个小顶堆然后遍历矩阵如堆,最后返回堆顶第k个元素。二维矩阵,矩阵中每一行从左到右,每一列从上到下都是非严格单调递增的,找到这个矩阵中第k个小的元素。可以使用二分值域方法,每一次选取一个数,然后查看每行比这个数小的数有多少,查看每一行时的也可以使用。进行,计算整个矩阵中有多少小于当前答案的元素,如果大于。

2024-12-25 05:02:03 573 1

原创 LC. 852 Peak Index in a Mountain Array

给定一个数组,数组数字先递增再递减,找到那个峰值的位置。数组由切仅有一个峰值使用二分查找,基于题目的数组性质,找峰值点有明确二分关系,如果当前数比前面的数大那么处于上升区,分值可能是当前点或者后面的点;如果当前数小于等于前一个数那么处于下降区,峰值点一定在这个数前面。所以我们这道题目是要找到当前数字大于前一个数的最后一个位置。找到当前数字小于前一个数的第一个位置这个位置前一个数即为解时间复杂度: O(logN)O(logN)O(logN)空间复杂度:O(1)O(1)O(1)

2024-12-25 04:34:23 379

原创 LC 2352. Equal Row and Column Pairs

维护一个hash table,整行的所有元素作为key,这里整行整列的信息我们直接将数字组合成字符串的形式 1,2,3 -> “1#2#3” 记录每行出现的频率,然后遍历每一列,查看每一列是否有和相同行与之匹配,计数即可。的二维整数矩阵,返回行和列的pair保证这一行和这一列的所有元素相同且顺序也相同。代表每一次哈希查找时字符串比较占用的时间。

2024-12-25 04:14:44 382

原创 LC 131. Palindrome Partitioning

基本思路就是DFS回溯对字符串进行分割,每一次分割时,查看当前分割出来的子串是否为回文,如果是继续递归,如果不是跳过找下一个位置。当递归到末尾时,把当前的分割组合写入最后结果中。那么如果判断子串是否时回文,这里我们可以使用字符串哈希,将字符串进行正向和逆向哈希,然后每一个判断子串回文时只要判断当前子串正向和逆向哈希值是否相同即可。给定一个字符串,找出所有字符串分割方式将原始字符串分割成多个子串,保证每个子串都是回文。L为字符串哈希储存空间,h为递归的栈空间。L为字符串哈希时间,为DFS分割组合时间。

2024-12-24 15:49:37 363

原创 [模版总结] - 字符串哈希robin-karp算法

常规情况下,比较两个字符串是否相同,是通过遍历两个字符串进行逐字节比较,时间复杂度为OLOL, 在频繁比较时会很慢,字符串哈希算法是采用将字符串逐位转化为数字,这样可以计算任意区间的substring,并在O1O1时间内完成比较。nums×P3t×P2a×Prnums×P3t×P2a×PrHash函数为fstring∑i1lsi−1×Pi−1fstring∑i1l​s。

2024-12-24 15:35:39 1049

原创 LC 318. Maximum Product of Word Lengths

这道题目可以使用bitmap将压缩成一个26位二进制,每一位0/1表示是否有这个字符串,类似one-hot encoding。然后两个字符串比较时间复杂度可以压缩成 bit(A) & bit(B) 也就是 O(1)简单的思路是将字符串编码成长度为26的数组,然后两两字符串比较,这样可以将O(L1。给定一个只包含小写字母字符串数组,返回两个没有共同字符的字符串长度乘积的最大值。L为字符串数组总长度,N为hashmap空间。L2)的比较压缩到O(26。N为Hashmap空间。

2024-12-13 13:09:19 616

原创 LC 606. Construct String from Binary Tree

二叉树序列化过程可以通过前序遍历实现,我们可以使用递归方法,维护一个全局字符串变量,递归出口当节点为空。每次层递归时,把当前节点加入,然后这道题如果存在左或右子节点时,不管左节点是否为空一定要加入括号。所以查看是否存在左或右节点,如果存在。加左括号然后遍历左子树(不管有没有)遍历结束加入右括号,然后查看右节点是否存在如果存在那么重复左节点操作即可。给定一个二叉树,返回序列化后二叉树结构,要求用括号包含子树信息.

2024-12-02 12:31:36 409

原创 LC 536. Construct Binary Tree from String

给定一个二叉树字符串表达式,用数字代表当前节点括号包含子树例如 2(3)(4),返回整个二叉树。题目字符串只有左右括号以及负号或者数字,且不用考虑invalid括号问题。

2024-11-30 03:39:34 556

原创 LC 863. All Nodes Distance K in Binary Tree

给定一个二叉树和一个目标节点,返回与目标节点距离K的所有节点集合。

2024-11-24 06:56:42 343

原创 LC 543. Diameter of Binary Tree

给定一个二叉树树根,返回最长的"半径",这里半径为树中任意两个节点之间路径的长度。

2024-11-24 06:09:39 417

原创 [模版总结] - 树的基本算法4 -最近公共祖先 LCA

LCA:在一个树中,距离两个节点p,q最近可以是其本身并且同时包含这两个子节点的节点。

2024-11-22 17:34:28 1017

原创 LC 199. Binary Tree Right Side View

基本思路就是层级遍历整个树,然后将每一行最后一个元素插入结果。给定一个二叉树,返回从上到下每一行最右边的节点。M为队列中节点数,一般等于单层最多节点的个数。

2024-11-22 16:22:17 189

原创 LC 314. Binary Tree Vertical Order Traversal

给定一个二叉树,将垂直位置上同一列的所有节点整合成一个集合,并按照列的左右位置从左到右返回所有集合,同一列的集合中元素顺序保证,从上到下,从左到右。如果两个节点同行同列,按照从左到右依次返回。

2024-11-21 16:16:23 377 2

原创 LC 173. 二叉树迭代器 Binary Search Tree Iterator

实现一个BST中序遍历迭代器数据结构,支持问询操作:next() && hasnext()对于二叉树前中后序遍历迭代实现可以参考这篇blog -中序遍历(左根右)整体思路就是先遍历左子树左子节点,在过程中将每一个节点根节点压栈,当左子节点遍历到底后,弹栈得到当前根节点,并继续处理右子树。初始化操作:创建一个栈,并把BST中最小元素也就是最左的节点以及途中经过的节点压入栈中next()操作:我们保证栈顶一定是BST中当前最小节点,弹出栈顶,然后更新第二小节点,也就是。

2024-11-21 15:06:56 944

原创 LC 560. Subarray Sum Equals K

给定一个一维数组求出和为K的所有子序列个数。求一个连续区间内和,可以用到前缀和来快速计算区间和,每一次遍历的时候就找 前缀和(0, i) - 前缀和(0, j) == K的个数也就是找前面前缀和 (0, j)等于 前缀和(0, i)-k的个数,这就转变成two sum问题,遍历时记录用哈希表保存前缀和数值对应前缀个数,然后查看前缀和等于当前前缀和-K的前缀个数,更新结果即可。

2024-11-21 05:50:07 278 1

原创 LC 174. Dungeon Game

给定一个2D矩阵,每一个格子值有正有负,代表你经过这个位置的buff或者debuff,玩家具备初始生命值X从左上移动到右下(只允许向右或者向下移动),保证经过每一个格子时生命值大于0。问从起点走到终点所需要的最少初始非负生命值是多少。可以采用动态规划进行求解,题目思路和之前Leetcode 64路径和最小类似。这里需要注意的是如何定义一个具有递推关系的状态变量,如果我们dp[i][j]定义为就是错的,因为起点到每一个(i , j)的初始最小生命值,并不具有递推关系。所以可以反过来定义。

2024-11-21 04:22:12 573

原创 LC 2304. Minimum Path Cost in a Grid

注:这道题目moveCost矩阵 moveCost[i][j]代表value==i的点移动到下一层。Leetcode 64题的变种题,只不过节点之间edge有了权重,最后要找到cost和最小的路径。过于暴力,本题依然存在递推依赖关系,我们可以直接使用动态规划求解.如果直接暴力所有所有路径然后找最小时间复杂度需要。

2024-11-20 17:43:32 1009

原创 [Leetcode刷题] - LC 62 & 63. Unique Path I & II

题目要求寻找从左上到右下的所有可能路径,求解所有可能的方案,并且路径个数有递推关系,可以使用动态规划。和上一道题类似只不过中间加入障碍物,整体思路类似只是状态转移方程中需要加入一个额外条件,如果。corner cases: 起点也可能被堵。为了节省空间直接在原矩阵上进行递推操作。是障碍物 dp[i][j]归零。额外条件: 如果(左边路径被堵)&& (上边路径被堵)

2024-11-20 17:17:55 879

原创 [Leetcode刷题] - LC64 Minimum Path Sum

题目和思路很类似,都是动态规划入门题。题目求从二维矩阵左上到右下的数值和最小的路径,粗暴的解法可以通过DFS枚举所有路径找到,对着这道题可以求解路径和最小的路径存在递推关系可以使用动态规划。动态规划三要素dpijmindpi−1jdpij−1])gridij。

2024-11-20 16:53:47 934

原创 [模板总结] - 单向链表LinkedList操作

Leetcode。

2024-11-16 16:39:22 1074 2

原创 [题型总结] - 数组排列类问题

整体思路就是先对于数组进行排序,对于相同的数字我们会定义一个顺序,比如[1,1,2] 我们要维护前面两个1的相对位置[1(1), 1(2), 2], 如果前一个1没有使用的时候,不允许使用后一个1。和上一道题类似,还是使用回溯暴力枚举所有可能性,由于有重复值,排序中会存在相同结果,比如[1,1,2] 排列中会出现两次[2,1,1],如果跳过这些重复解。2. 如果当前值与前一个数重复:那么只有前一个数被使用过,并且当前值没有被使用才能加入结果。题目给定一个带有重复数的数组,返回所有不重复的排列方式。

2024-11-16 15:32:09 563

原创 [系统设计总结] - Proximity Service算法介绍

Proximity Service广泛应用于各种地图相关的服务中比如外卖,大众点评,Uber打车,Google地图中,其中比较关键的是我们根据用户的位置来快速找到附近的餐厅,司机,外卖员也就是就近查询算法。

2024-09-24 18:13:50 808 1

原创 [Leetcode刷题] - 栅栏涂漆DP类问题

为了实现记忆化搜索我们需要改写思路1代码,舍弃全局最小值,而是在递归中不断更新局部最小值, 之前的思路1的代码,我们是向下递归,在到底后更新结果,这样很难缓存重复解。这一类题目通常会问给定一组房子n和一组染料k去涂漆,并且会加入限制条件比如:某种颜色只能使用1次,相相邻房子不能涂同一种颜色,或者最多不能超过连续3个房子涂想通过颜色等等,让我们列举所有可能性总和,带限制条件的排列组合类问题。不难看出,在递归的过程中,存在着很多局部组合是重复的,我们完全可以将这些重复组合缓存起来,从而实现优化剪枝。

2024-06-29 03:38:18 1051 2

原创 [算法总结] - 蓄水池采样算法

在长度为N的数组中,随机等概率选取K个元素,如何实现这个随机算法。思路很简单,生成一个[0, N]的随机数index,然后返回index上的数值即可。但是,如果输入是一个长度未知的数组比如stream,先遍历得到数组大小,在遍历进行K次采样显然不够高效,这就引出了蓄水池算法。上述步骤中最难理解无非就是第三步,为什么这样做就可以实现每一个元素被选的概率是k/N。的元素, 在 k 步之前,他们被选中是没有随机性的 p = 100%;的元素,在k步之前,是没有概率的因为不存在。

2023-11-27 17:14:24 411

原创 [模版总结] - 拓扑排序

拓扑排序是一种特殊排序方式,是以有向无环图中结点依赖关系,将每个结点逐个排序,常见的用例比如Java Springboot的依赖注入机制。拓扑排序只是对有向无环图的一种排序方式有向无环图:图中任何结点无法通过若干边回到该结点有向有环图:图中某个结点可以通过若干边回到该结点。

2023-11-23 14:58:26 163

原创 [模版总结] - 树的基本算法2 - BST

BST - Binary Search Tree, 即二叉搜索树(有序二叉树)

2023-11-17 09:03:41 221

原创 [模版总结] - 树的基本算法3 - 结构转化

将二叉树以前序遍历的顺序转化成连接结构,要求in-place即不占用额外空间存储新的链表结构。注:这类题目最基本的解题思路是利用递归分治 (也可以使用迭代方法),在构建树结构的时候,我们通常会使用前序遍历的思路自上而下,进行建树,每一次递归中,得到左右子树的值进行连接。上面两道题目的合并版,比起使用上述括号形式进行序列化编码,这道题目我们可以对于序列化的格式进行简化,对于缺失的左右叶子结点我们用NULL来表示,每一个结点以逗号隔开。例子:[1,2,3,4] -> "1(2(4))(3)"

2023-11-16 12:24:39 186

原创 [模版总结] - 树的基本算法1 - 遍历 & 迭代器

二叉树基础总结,遍历篇

2023-11-10 10:08:58 162

原创 [亚麻高频题] - 最大重复元素处理问题

这道题目属于一道模拟题,基本思路就是创建一个HashMap<Integer, LinkedList<Integer>> 来维护数组中数值以及元素对应的位置信息,然后可以创建一个大顶堆来维护重复元素,每一次循环,取出堆中最大元素,找到对应链表中最靠前的两个index,从链表中删除这两个位置,将第二个元素除以2后更新到对应链表中,注意每一个链表要保证有序,所以如果每一次插入链表时要逐个进行比较然后插入。最大重复元素 6,去掉第一个,第二个除以2,数组变为[3, 6, 1, 2, 2]

2023-08-21 13:26:41 131

原创 [模版总结] - 集合划分类DFS模版

不难理解,在递归寻找解的过程中,有很多重复解的情况,比如桶1选择2,3,4号球,桶2选择5,6号球,这种情况和桶1选择5,6号球,桶2选择2,3,4号球是重复情况。- 思路很简单,每一层递归是给当前数字选择一个子集合,如果当前子集合超过等分值那么跳过,直到所有数字选完子集合后,比较子集合中是否相等即可。集合划分也是思路和排列组合类似,可以想象成给球分桶的问题,这种类型的题目通常有两个思考方式:给每一个球选桶,给每一个桶选球。这里的球就是指集合中的每一个数,而桶则是指等分的每一个子集合。

2023-07-28 15:22:36 244

原创 [Leetcode刷题] - LC 2770 达到末尾下标所需的最大跳跃次数

这道题目是跳跃游戏的改进版,思路和跳跃游戏一致,最简单的思路就是利用DFS暴力枚举所有情况,每一次递归中,遍历后继点,当后继点和当前点差值绝对值

2023-07-25 09:21:01 158

原创 [模板总结] - 拓扑排序

有向图邻接表和入度计算完成后,即可使用类似BFS方法进行遍历,创建一个队列进行存储,如果有节点入度为0那么就将该节点加入队列,然后找出与该节点相邻节点并将他们的入度-1,如果有新的入度为0的点出现继续加入队列直到为空为止。注:如果是有环形结构,那么你在拓扑排序可能会出现死循环,因为环形结构两个节点会不断进入队列。但也可以解决,可以设置一个阈值,如果加入队列节点个数超过了图中节点个数说明环形存在,即刻跳出。中以图中节点依赖关系对节点进行排序。1. 入度:每一个节点的入度可以理解为指向这个节点的节点个数。

2023-07-11 15:46:30 158

原创 [DoorDash面试题] - 饭店开门关门时间

基本套路就是先处理时间,将“hh:mm”转化为分钟,起始时间:5-(总分钟%5) + 总分钟;终止时间:总分钟 - (5-(总分钟%5))。给定一个开门和关门时间,格式为“mon 11:22 am”,计算出在这段时间之内所有以5mins为单元的时间列表。然后将这个区间内所有5mins为单位的时间找出,列入最终结果即可。没找到Leetcode原题,应该是一道doordash改编题。

2023-06-27 13:08:47 721

原创 [Leetcode刷题] - LC946 Validate Stack Sequences

本题考查对于Stack工作原理的理解,Stack出栈顺序是后进先出(LIFO),加入一个数组进栈顺序 [1,2,3,4,5],那么出栈就是[5,4,3,2,1], 如果期望出栈顺序是[4,5,3,2,1],那么必须在5进栈之前,要把4 pop出去。所以这道题整体思路就是一次将数字push进栈,设置一个指针记录当前出栈数字,如果进栈数==出栈数,那么将该数字pop,并且指针后移一步,最后判断指针是否指向末尾。

2023-05-24 03:03:52 79

原创 [Leetcode刷题] - LC322 Coin Change

题目链接:给定几种coins数额,假定每一种coin可以无限次使用,给定一个数额amount,问能加和成这个数额的最小coin的个数。

2023-05-23 04:51:08 128

原创 [Leetcode刷题] - LC075 Sort Colors

一个随机序列包含0,1,2 在不占用额外内存的情况下将序列排序。

2023-05-20 12:55:35 395

原创 [Leetcode刷题] - LC017 Letter Combination of a Phone Number

第一项是存储局部字符组合O(N), 第二项是由于我们每一次递归都将当前局部字符组合保存成tmp用于回溯,所以额外开的空间,这样的优点时,省去了每一次直接在字符上增删的O(N)耗时。这是一道Yahoo高频题,电话按键2-9每一个数字对应3-4个字母,现在问询给一个数字组合,返回所有可能的字母组合。一道经典DFS暴力搜索的题目,在递归过程中定义一个变量来保存当前的组合字符。组合树状结构的空间,最坏情况是所有数字都是7,9全部4中选择;,额外只需要开StringBuilder的空间即可。

2023-05-20 04:50:32 104

原创 [OOD设计] - 图书馆系统

基于基本功能,需要数据库来保存大量信息包括书籍,书架,用户,预约信息,这里将数据库简化成HashMap形式。当然真正的一个图书馆系统还应该具备下面这些功能,我们这里只实现上述基本功能。书籍类中包含书籍名称,ID,类别,书籍所在书架位置,以及借阅信息类。包括用户ID,当前持有书籍等一些基本用户信息。用于保存书籍的位置信息,以及查找函数。书架类 + 书架系统类。

2023-05-18 12:57:13 449

原创 [OOD设计] - 电梯系统设计

OOD设计总结 - 电梯系统设计

2023-05-16 14:49:31 1047

原创 [Leetcode刷题] - LC054 Spiral Matrix

的空间保存访问过的元素,也可以简化为在上下左右四个方向构造一个边界,每一次到达边界后,将边界向内收缩。这样可以节省空间复杂度。本题思路比较直接,按照方向右 -> 下 -> 左 -> 上 -> 右的顺序进行遍历,可以构造一个额外。

2023-03-30 13:50:57 78

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除