LeetCode刷题
肥大毛
落魄谷中寒风吹,春秋蝉鸣少年归。
展开
-
SQL刷题---2021年11月每天新用户的次日留存率
3.以表a为主与表b进行连接,过滤条件为同一个用户在表b中的日期比表a中日期多一天,根据此结果计算留存率。1.首先算出每个新用户注册的日期,将其命名为表a。2.计算出每个用户登录的天数,将其命名为表b。原创 2024-04-16 18:33:25 · 602 阅读 · 1 评论 -
LeetCode刷题---销售分析III
首先找出在sales表中筛选出符合指定日期的prioduct_id,将其查询结果命名为t1。与product表进行关联得出最终结果。原创 2024-04-01 15:18:37 · 132 阅读 · 0 评论 -
LeetCode刷题---查询近30天活跃用户数
1.给出满足的条件,截止至2019-07-27的近30天。2.按照日期分组,统计活跃用户个数。原创 2024-03-27 16:48:47 · 256 阅读 · 0 评论 -
LeetCode刷题---游戏玩法分析 IV
2.将Expected表和原始表activity进行关联,求出首次登录后第二天又登录的player_id,将其创建为临时表,命名为result。3.将从Result表中查询出来的用户个数除以原表activity中用户的个数,结果保留两位小数。1.首先查询出每个用户首次登录的第二天,并将其创建为临时表,命名为Expected。原创 2024-03-27 16:04:03 · 368 阅读 · 0 评论 -
LeetCode刷题---即时食物配送 II
2.与原表连接,求出在用户首次订单表中即时订单的数量的总和。1.首先先求出每个用户首次订单表,将其命名为表t。3.求出每个用户首次订单的数量。4.计算得到最终结果。原创 2024-03-12 22:31:31 · 364 阅读 · 0 评论 -
LeetCode刷题---路径总和
是一种用于遍历或搜索树或图的算法。在搜索开始时,首先将根节点放入队列中。然后,在每一步中,算法都会检查队列中的第一个节点,并访问其所有尚未访问过的邻居节点。这些邻居节点随后被添加到队列的末尾。然后,算法从队列中删除当前节点,并继续处理队列中的下一个节点。原创 2024-03-12 16:19:25 · 342 阅读 · 0 评论 -
LeetCode刷题---每月交易I
当state不等于approved时,将state赋值为NULL或0。对分组后的结果求解,使用IF函数进行过滤。1.在对日期截取时,使用了MySQL中的。首先按照日期和国家/地区进行分组。函数,将日期转换为指定格式的日期。2.该题配合MySQL中的。原创 2024-03-11 20:56:55 · 588 阅读 · 2 评论 -
LeetCode刷题---二叉树展开为链表
如果存在左节点,创建辅助节点指向左节点,判断左节点是否有右节点,如果有右节点,则将辅助节点指向右节点,此时进行拼接操作,即将辅助节点的右节点指向当前节点的右节点,当前节点cur的右节点指向当前节点的左节点,且当前节点的左节点指向为Null。判断当前节点是否有左节点,如果不存在左节点,则当前节点向右移一位。结束上述步骤之后,当前节点向右移一位,之后开始重新执行上述步骤。当根节点不为空时,从二叉树根节点开始遍历。原创 2024-03-07 18:58:19 · 344 阅读 · 0 评论 -
LeetCode刷题---填充每个节点的下一个右侧节点指针 II
如果cur.left不为空时,pre的next节点为cur.left,之后pre指针前进,同理,当cur.right不为空的时候,pre的next指针为cur.right,之后pre前进,最后当前节点cur前进。如果cur前进后为空,则表示需要开始遍历下一层,cur指向dummy的next节点,如果cur仍为空,则循环结束,返回根节点,如果cur不为空,则表示cur已经指向了下一层的第一个节点处,开始该层的遍历。创建辅助指针pre,pre初始指向dummy,之后通过pre来填充当前层的next节点。原创 2024-03-07 00:57:44 · 532 阅读 · 1 评论 -
LeetCode刷题---填充每个节点的下一个右侧节点指针
如图所示,值为2的节点的左子节点的next节点为其右子节点,此时判断2的节点的next节点是否为NULL,如果不为NULL,值为2的节点的next节点为值为3的节点,且值为2的节点的右子节点的next节点为值为3的节点的左子节点。如果值为2的节点的next节点为NULL,则从其下一层的最左边的节点开始重新遍历。因为根节点的next节点为NULL,开始从根节点的下一层的最左边的节点开始遍历。从根节点开始,根节点的左子节点的next节点就指向根节点的右子节点。可以根据每一层来依次遍历。原创 2024-03-06 22:43:13 · 397 阅读 · 0 评论 -
LeetCode刷题---查询结果的质量和占比
对组内的rating的值使用IF函数进行判断,如果rating=3,则将其标识为0,通过次方法可以找出组内rating的值小于原创 2024-02-27 22:39:19 · 345 阅读 · 0 评论 -
LeetCode刷题---各赛事的用户注册率
3.最后将上一步求出的count数量除以第一步得出的count数量得出注册率,并按照题中要求对结果进行排序。2.按照contest_id进行分组,求出每个赛事有多少用户参赛。根据题意要求出每个赛事的注册率,首先就要确定有多少参赛用户。原创 2024-02-27 15:23:58 · 391 阅读 · 0 评论 -
LeetCode刷题---平均售价
首先对Prices表和UnitsSold表进行Left join操作,之后按照购买日期位于定价开始和结束日期之间的条件进行过滤。将price和units的乘积进行累加,将units的值进行累加,之后将两个累加的和相除得到最终结果。按照product_id进行分组,对组内进行计算。原创 2024-02-27 10:08:15 · 358 阅读 · 0 评论 -
LeetCode刷题---确认率
AVG(c.action=‘confirmed’)表示对action列进行求平均,如果action=‘confirmed’,则返回true,此时在AVG函数中,将其计数为1,如果为false,则将其计数为0.将Signups和Confirmations进行左连接,连接的条件为Signups.user_id=Confirmations.user_id。但是对于值为null的行,AVG在进行计算的时候,则会将其忽略,所以此时使用IFNULL函数将其null值改为0.原创 2024-02-26 23:38:43 · 341 阅读 · 0 评论 -
LeetCode刷题---从中序与后序遍历序列构造二叉树
传入参数中,左子树在中序遍历中的起始索引为中序遍历中第一个数的索引,终止索引为根节点midRoot-1,左子树在后序遍历中的起始索引为后序遍历中第一个数的索引,终止索引为起始索引+左子树的节点个数(通过中序遍历中根节点的索引-1-中序遍历中左子树的起始索引得出)。传入参数中,右子树在中序遍历中的起始索引为midRoot+1,终止索引为midRight,在后序遍历中的起始索引为左子树在后序遍历中的终止索引+1,终止索引为lastRoot-1。后序遍历中最后一个数为二叉树的根节点。原创 2024-02-26 22:58:46 · 467 阅读 · 0 评论 -
LeetCode刷题---从前序与中序遍历序列构造二叉树
递归创建右子树,传入参数为先序和中序遍历数组,右子树的起始节点索引=根节点在中序遍历数组中的索引+1和右子树的终止节点索引(首次传入右子树的终止节点索引为数组长度n-1)创建递归方法buildTreeNew(先序遍历数组,中序遍历数组,左子树的起始节点,左子树终止节点索引,右子树的起始节点,右子树终止节点索引)其中左子树的终止索引可以根据 根节点在先序遍历数组中的索引(首次传入为0)+左子树节点的个数=左子树终止节点的索引。首先根据先序遍历找出二叉树的根节点,先序遍历的起始索引为根节点的索引。原创 2024-02-26 21:02:03 · 646 阅读 · 0 评论 -
LeetCode刷题---至少有5名直接下属的经理
首先将原表(经理表manager)与自身(下属表emp)进行连接,连接条件为manager.id=emp.manager,之后按经理表中的id进行分组,统计每个经理的下属员工的个数,将统计的结果命名为表t1。从t1中取出count>=5的经理id,将查询的结果命名为表t2。找出Employee表中下属员工至少有5个的经理名称。原创 2024-02-22 17:39:57 · 340 阅读 · 0 评论 -
LeetCode刷题---对称二叉树
4.分别递归遍历左子树的左子树和右子树的右子树是否对称,左子树的右子树和右子树的左子树是否对称,如果都对称,则返回true。3.如果左节点的值和右节点的值不相等时,返回false。2.如果左节点和右节点只有一个为空时,返回false。首先对二叉树进行判空,如果根节点为空,则返回true。1.如果左节点和右节点同时为空,则返回true。接下来对当前节点的左节点和右节点进行判断。原创 2024-02-22 16:13:46 · 310 阅读 · 0 评论 -
LeetCode刷题---反转二叉树
创建临时节点,将右节点赋值给临时节点,将左节点赋值给右节点,再将临时节点赋值给左节点。对二叉树进行反转,如果根节点为空,则返回。原创 2024-02-22 15:02:36 · 351 阅读 · 0 评论 -
LeetCode刷题---相同的树
找出递归结束条件,如果两个树满足条件一个树或者其子树为空,而另一个树或者其子树不为空,两个树或者其子树的值不等,则返回false。使用递归的方法对两个树进行判断,如果两个的树的根或者其左子树和右子树的值都相等,则返回true。首先对两个树进行空值判断,如果两个树都为空,则返回true。原创 2024-02-21 10:59:55 · 392 阅读 · 0 评论 -
LeetCode刷题---LRU缓存
如果哈希表中已经存储该节点,则需要对该节点的数据进行更新,首先根据key从哈希表中取出该节点,再对节点中的value重新赋值,之后根据LRU算法将该节点从链表中删除,再添加到链表表头的位置。在写put方法的时候,如果哈希表中未存储该节点,则创建一个新的节点,节点中key和value分别为要添加的键和值,之后将key和新创建的节点添加到哈希表中,在将新的节点添加到链表头部。在写get方法来获取某节点的时候,如果哈希表中存储了该节点,根据LRU算法,则先将该节点删除,再将该节点添加到链表中。原创 2024-02-21 09:40:45 · 1514 阅读 · 0 评论 -
LeetCode刷题---二叉树的最大深度
如果有子节点,则先将当前节点的左节点作为参数传入方法中,之后在将当前节点的右节点作为参数传入方法中。使用先序遍历的方法来找出二叉树的最大深度,即先访问根节点,在访问左节点,之后是右节点。对于任意一个节点,其深度为其左子树深度和右子树深度的最大值加1。二叉树的最大深度是从根节点到最远叶子节点的最长路径上的节点数。首先判断当前节点是否还有子节点,如果没有则结束递归,返回0。最大高度是从根节点到最远叶子节点的最长路径的长度。最后对取出的左右节点深度的最大值+1返回即可。使用递归的方法来解决该题。原创 2024-01-27 10:19:00 · 380 阅读 · 0 评论 -
LeetCode刷题---学生们参加各科测试的次数
之后将学生表和科目表的笛卡尔积与grouped表进行左外连接,连接条件为学生id和科目(这样保证在学生id不在考试表中的学生也可以被统计上),结果按照学生id,姓名,科目,进行分组。对考试表Examinations表统计学生参加考试的次数,按照学生id和考试科目进行分组,使用count函数统计次数,起别名为grouped表。根据题意要实现每个学生参加每个科目考试的次数,如果没有参加,则统计次数为0。首先将学生表和科目表进行笛卡尔积。原创 2024-01-26 16:11:50 · 389 阅读 · 0 评论 -
LeetCode刷题---每台机器的进程平均运行时间
使用case—when函数修改,如果状态为start,则将其时间值变为负数,如果状态为end,则保持不变。先按照机器machine_id进行分组,然后求每台机器内的平均运行时间。使用sum函数对同一台机器内所有进程的运行时间进行求和。使用上一步的累加值除以同一台机器内进程的个数得到平均值。原创 2024-01-25 23:27:54 · 339 阅读 · 0 评论 -
LeetCode刷题---分隔链表
此时将right指向节点的下一个节点指向空,right指向节点即为合并后链表的尾节点,left的下一个节点指向r初始节点的下一个节点。如果当前节点的val值大于等于x,right指向节点的下一个节点为当前节点cur,right前进一个节点。如果当前节点的val值小于x,left指向节点的下一个节点为当前节点cur,left前进一个节点。创建链表r用来表示大于等于给定值x的链表,创建辅助链表right指向r的初始节点。创建链表l用来表示小于给定值x的链表,创建辅助链表left指向l的初始节点。原创 2024-01-25 22:43:06 · 392 阅读 · 0 评论 -
LeetCode刷题---旋转链表
首先创建辅助节点cur遍历指向链表最后一个节点,并将cur的下一个节点指向head头节点,形成闭环,并且在遍历的过程中计算链表的长度n。n-k表示当前节点(当前节点指向未反转节点的最后一个节点)到反转后的链表的最后一个节点的位置。当cur前进了n-k个节点后,即cur已经走到了反转后链表的最后一个节点。再创建一个新的节点指向反转后链表的头节点,再将cur的下一个节点指向空。为了防止k>n的情况,需要对n-k的结果对n求余。原创 2024-01-25 21:45:29 · 479 阅读 · 0 评论 -
LeetCode刷题---删除排序链表中的重复元素 II
4.如果当前节点cur的下一个节点和下下一个节点的val值相等,则删除cur的下一个节点,使得cur的下一个节点指向cur的下下个节点。3.开始遍历链表,如果当前节点cur的下一个节点和下下一个节点都不为空的情况下,对cur的下一个节点和下下一个节点的值进行判断。5.重复第4步,直至cur的下一个节点和下下一个节点的val值不相等,此时cur节点前进。1.首先定义虚拟节点dummy,dummy的下一个节点指向head节点。2.定义辅助节点cur指向dummy节点。原创 2024-01-24 22:49:15 · 421 阅读 · 2 评论 -
LeetCode刷题---最长交替子数组
如果上述条件不符合,对快指针进行判断,如果nums[fast]等于nums[fast-1]+1,则slow=fast,如果nums[fast]不等于nums[fast-1]+1,则slow=fast-1。根据题意得如果快指针的索引为奇数,则nums[fast]=nums[slow]+1,偶数则,nums[fast]==nums[slow]快指针继续向前遍历,每次都与之前长度比较,取最大值。遍历快指针从1遍历到nums.length-1。首先慢指针指向0,快指针指向1。该题使用双指针的思想来解决。原创 2024-01-23 14:59:12 · 348 阅读 · 0 评论 -
LeetCode刷题---删除链表的倒数第 n 个结点
首先让快指针fast先到第n+1个节点,然后fast指针和slow指针一起走,知道fast指针指向空。让slow指针的下一个节点指向slow指针的下一个节点的下一个节点来删除倒数第n个节点。定义快指针fast,慢指针slow,链表中删除第n个节点的前提是要找第n+1个节点。此时slow指针指向了倒数第n个节点的前一个节点,执行删除操作。使用双指针的思想来解决该题。原创 2024-01-23 09:30:25 · 504 阅读 · 0 评论 -
LeetCode刷题---反转链表II
next:永远指向 curr 的下一个节点,循环过程中,curr 变化以后 next 会变化;pre:永远指向待反转区域的第一个节点 left 的前一个节点,在循环过程中不变。在需要反转的区间里,每遍历到一个节点,让这个新节点来到反转部分的起始位置。执行操作 ①:把 curr 的下一个节点指向 next 的下一个节点;执行操作 ②:把next 的下一个节点指向 pre 的下一个节点;执行操作 ③:把 pre 的下一个节点指向 next。先将 curr 的下一个节点记录为 next;使用了三指针的思想。原创 2024-01-16 16:09:56 · 369 阅读 · 0 评论 -
LeetCode刷题---反转链表
此时pre节点前进到cur节点,cur节点前进到tmp节点,直至cur节点为空,此时pre节点为头节点。开始遍历链表,创建临时节点tmp指向cur的下一个节点,之后将cur的下一个节点指向pre节点。首先定义pre指针,初始化为空,和cur指针,初始化为头节点。使用双指针+临时指针的方法来解决该问题。将pre节点返回即可。原创 2024-01-16 14:49:22 · 377 阅读 · 0 评论 -
LeetCode刷题---随机链表的复制
开始遍历原链表,遍历到每个节点的时候,就去查哈希表,取出新链表的节点,将原链表当前节点的next和random节点都复制到新链表的节点中去。首先对原链表遍历,将原链表每个节点和新链表每个节点形成对应关系,存入到哈希表中,key为原链表的节点,value为新链表的节点。之后重置辅助链表指向原链表头节点。使用哈希表来解决该问题。因为题中要求是深拷贝。原创 2024-01-16 14:36:35 · 384 阅读 · 0 评论 -
LeetCode刷题---基本计算器
如果当前字符为数字字符,判断当前字符的下一个字符是否也是数字字符,如果下一个字符也是数字字符,需要将其和之后的数字字符都转换为int类型再进行合并,直至下一个字符不为数字字符为止。如果当前字符为左括号,则将当前结果集推入栈中,并重置当前结果集为0,将当前符号位推入栈中,并重置当前符号位。如果当前字符为右括号,则将当前结果集与取出的第一个栈顶元素(符号位)相乘再与存入的结果集相加。如果当前字符为运算符,则更新符号位sign(加操作sign=1,减操作sign=-1)根据题意,字符串中包含的运算符只有+和-原创 2024-01-15 16:09:26 · 484 阅读 · 0 评论 -
LeetCode刷题---逆波兰表达式求值
首先定义一个栈Stack,接着对tokens数组进行遍历,如果当前元素是非数字字符串的话(运算符),就从栈中取出两个元素根据该运算符进行计算,将计算后的结果添加到栈中。如果当前元素是数字字符串,直接将其添加到栈中。原创 2024-01-15 15:47:35 · 695 阅读 · 0 评论 -
LeetCode刷题---最小栈
push:首先将数据push进数据栈中,此时再判断辅助栈是否为空或者当前数据是否小于辅助栈中的最小元素(栈顶元素),如果条件成立,则将元素页push进辅助栈中。pop:首先移除数据栈中的栈顶元素,在判断当前移除的数据是否小于等于辅助栈的栈顶元素,如果是则证明移除的元素是当前最小元素,此时辅助栈中也执行pop操作。定义数据栈(用于实现正常操作流程)和辅助栈(用于获取最小元素)。getMIn:返回辅助栈的栈顶元素。top:返回数据栈的栈顶元素。该题通过辅助栈的方式来解决。原创 2024-01-09 18:13:29 · 410 阅读 · 0 评论 -
LeetCode刷题---简化路径
定义双指针,i为慢指针,j为快指针,遍历原路径,如果path.charAt(i)为‘/’时,i++,j为i+1,j++,当path.charAt(j)也为’/'时或者j=path.length时,截取字符串,起始下标为i,终止下标为j,此时更新i的下标位置,i=j。接着对字符串按照题中的要求进行判断,如果字符串为"…“,则返回上一层(需要判断队列中是否为空,如果不为空就从队列中取出最后一个元素),如果字符串不等于”.",则将该字符串添加到队列中的最后一个位置,重复以上操作直至将原路径字符串遍历完。原创 2024-01-09 09:43:55 · 364 阅读 · 0 评论 -
LeetCode刷题---两数之和
首先定义一个Map,key为数组中的每个元素,value为每个元素的索引下标。接着遍历原数组,对每一个元素进行判断,如果哈希表中包含target-nums[i],则将其value和当前下标封装到一个数组中返回,如果不包含target-nums[i],则将target-nums[i]作为key,i作为value加入到Map中。该题使用哈希表的思想解决该问题。原创 2024-01-08 15:04:27 · 363 阅读 · 0 评论 -
LeetCode刷题---插入区间
之后遍历合并后的数组,如果下一个区间的start小于等于上一个区间的end,则两个区间重叠,需要执行合并区间的操作,合并后的新区间的start为第一个区间的start,新区间的end为两个区间中最大的end。之后将新区间添加到List中。如果下一个区间的start大于上一个区间的end,则证明两个区间不重叠,此时直接将当前区间加入到List中。最后将辅助列表List转换成数组返回。首先将新的区间加入到原始区间数组中,再对合并后的数组按每个区间的第一个元素排序(start)原创 2024-01-05 16:02:33 · 365 阅读 · 0 评论 -
LeetCode刷题---用最少数量的箭引爆气球
创建一个List用于存储遍历后的区间,先将排序后的数组的第一个元素加入到List中,之后开始遍历数组。如果第二个区间的start大于第一个区间的end,则证明两个区间不重叠,直接将当前区间加入到List中,如果第二个区间的start小于或等于第一个区间的end,那么两个区间重叠,此时将两个区间合并,合并后的区间的start为第一个区间的start,end为两个区间的最小end,再将合并后的区间加入到List中。最终遍历结束后,List的size即为所需要的最小弓箭数量。该题使用贪心的思想来获取局部最优解。原创 2024-01-05 15:32:45 · 383 阅读 · 0 评论 -
LeetCode刷题---旋转图像
接着走一轮遍历,将第1列和第n列进行交换,第2列和第n-1列进行交换,直至得到最终的矩阵。首先对主对角线两边的元素进行交换。原创 2024-01-03 18:27:50 · 549 阅读 · 0 评论