- 博客(62)
- 收藏
- 关注
原创 110. 平衡二叉树
第一次没有写出来的原因:递归函数的返回值应该是boolean(判断当前节点的是不是AVL树)还是int(返回当前节点的树高)。但是有一个综合的办法,因为树高一定是正数,那么负数就可以表示当前树不是AVL树。
2024-01-23 11:56:26
380
原创 94.二叉树的中序遍历
而在中序遍历中,首先访问根节点,但是不记录,然后访问左子节点,当访问的节点没有左子节点时,才从栈中弹出一个节点并记录,然后转向右子节点。在前序遍历中,首先访问根节点,记录根节点然后访问左子节点,符合前序遍历 中左右的顺序。最重要的区别是访问节点和记录节点的时间。
2024-01-21 16:50:05
301
原创 347.前 K 个高频元素
首先用map记录每个value出现的频次key,然后倒入数组中,以key进行sort排序,然后再返回前k个value。
2024-01-19 17:25:25
372
原创 239. 滑动窗口最大值
/ 滑动窗口内的元素// 要弹走的元素就是滑动窗口内的最大元素if (!// 从后往前,因为滑动窗口后面的元素肯定小于前面的元素while (!// 不保持滑动窗口的大小,而是保持滑动窗口最左边的数是最大的// result的索引// 自定义队列// 将前k个元素放入队列i < k;i++) {i++) {// 滑动窗口移除最前面的元素,判断该元素是否放入队列维护滑动窗口内左边始终是最大值,保证滑动窗口内的元素由大到小。
2024-01-19 12:04:50
354
原创 1047. 删除字符串中的所有相邻重复项
原地操作,双指针发,之前也用过这种思路,快指针操作String s,慢指针操作新字符串。这里需要注意的是慢指针指向的是新字符串的下一个位置,在循环一开始,先把这个位置尝试填上字符,如果可以消掉,那慢指针后退一步。本质上,String是一个不可变字符串,每一次对String操作的过程都是重新创建一个String字符串的过程。我的解分为两部分,第一部分是入栈匹配,第二个部分是出栈转为结果字符串。String初始化可以指定字符数组的索引String(ch, 0, slow),[0,slow).
2024-01-05 11:57:19
403
原创 232.用栈实现队列
在出栈的时候如果stackOut中有元素,则直接可以弹出;如果没有就把所有的stackIn元素倒入stackOut。这样的话进栈的时候直接压入stackIn就可以。
2024-01-03 11:14:24
348
原创 第18题. 四数之和
剪枝也是一个重要的问题,target如果是负数,那么还需要判断nums[i]是不是大于0,这种情况才可以剪枝。为什么使用双指针法而不是哈希表?
2024-01-02 11:36:50
336
原创 第15题. 三数之和
对于left和right向中间靠拢的过程中要保证,如果一个数已经在第二个位置出现过,那left应该向后移动保证这个数不再出现第二次。因为第一个位置固定,第二个位置的数如果一样,三元组就是一样的。对于第一个位置,去重需要在遍历时保证,如果这个数已经在三元组的第一个位置出现过,就没有必要再出现第二次。由于 Arrays.asList() 返回的列表是基于数组的,因此它的长度是固定的,不能被修改。首先遍历三元组的第一个位置,然后使用双指针法,找到后面两个位置。双指针法的使用前提是数组是有序的。
2024-01-01 21:53:42
394
原创 454题.四数相加II
注意map的方法怎么使用,比如get()、put()、contains()的传参和返回值。如果调用put()查找map中没有的Key,返回的是null。
2023-12-29 11:05:01
362
原创 209.长度最小的子数组
官方代码是遍历right指针,我觉得和我写的不分伯仲。right指针向后移动之后,sum再+不断的调节子序列的起始位置和终止位置。left指针移动之前,sum就-
2023-12-24 10:55:28
332
原创 27.移除元素
我的想法局限在了如何遍历完旧数组,而没有想到其实遍历构建新数组更好。快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组。慢指针:指向更新 新数组下标的位置。以将要构建的新数组为中心来写代码。
2023-12-23 20:26:46
332
原创 【元素选择器】
题意:思路:代码:#include<iostream>#include<string>using namespace std;struct node{ string s; string bq;//标签属性 bool if_id; string id;//id属性 int father; int level;//两个点一级,四个点两级 void deal() { int len = s.size(); int f = 0; for
2020-07-11 20:13:21
275
原创 【炉石传说】
题意:《炉石传说:魔兽英雄传》(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集换式卡牌游戏(如下图所示)。游戏在一个战斗棋盘上进行,由两名玩家轮流进行操作,本题所使用的炉石传说游戏的简化规则如下: * 玩家会控制一些角色,每个角色有自己的生命值和攻击力。当生命值小于等于 0 时,该角色死亡。角色分为英雄和随从。 * 玩家各控制一个英雄,游戏开始时,英雄的生命值为 30,攻击力为 0。当英雄死亡时,游戏结束,英雄未死亡的一方获胜。 * 玩家
2020-07-11 19:56:39
116
原创 【宇宙狗的危机】
题意:这棵树是一颗二叉搜索树,同时任意树边相连的两个节点的gcd(greatest common divisor)都超过1。思路:这是一道区间dp的问题。以L[i][j]表示从i到j可以组成一个二叉搜索树,R[i][j]同理。对于一个区间,遍历其中所有点作为root,因为只有其中有一个点作为root时可以让这个区间构成二叉搜索树,则该区间就是有效的。转移方程是如果gcd[i-1][root]>1,则L[i-1][j]就是有效的,同理如果gcd[root][j+1]>1,则R[i][j
2020-06-10 12:03:49
90
原创 【ZJM要抵御宇宙射线】
题意:假设宇宙射线的发射点位于一个平面,ZJM已经通过特殊手段获取了所有宇宙射线的发射点,他们的坐标都是整数。而ZJM要构 造一个保护罩,这个保护罩是一个圆形,中心位于一个宇宙射线的发射点上。做一个最小面积的保护罩。思路:给所有点按照输出大小顺序排序,计算以每个点为圆心的保护罩的半径平方,找最小的。首先数据范围要求long long,并且所求为半径平方,注意!!!代码:#include<iostream>#include<algorithm>#include&
2020-06-10 11:50:36
121
原创 【TT数鸭子】
题意:每一只鸭子都不 一样,或羽毛不同,或性格不同。TT在脑子里开了一个map<鸭子,整数> tong,把鸭子变成了 一些数字。现在他好奇,有多少只鸭子映射成的数的数位中不同的数字个数小于k。思路:计算每一只鸭子对应的数值的数位中不同的数字的个数,然后与k比较,最后累加。代码:#include<stdio.h>using namespace std;int solve(long long a, int k){ int b[10]; for (int i = 0
2020-06-10 11:46:20
452
原创 【A - 猫睡觉问题】
题意:众所周知,TT家里有一只魔法喵。这只喵十分嗜睡。一睡就没有白天黑夜。喵喵一天可以睡多次!!每次想睡多久就睡多久╭(╯^╰)╮喵睡觉的时段是连续的,即一旦喵喵开始睡觉了,就不能被打扰,不然喵会咬人哒[○・`Д´・ ○]可以假设喵喵必须要睡眠连续不少于 A 个小时,即一旦喵喵开始睡觉了,至少连续 A 个小时内(即A*60分钟内)不能被打扰!现在你知道喵喵很嗜睡了,它一天的时长都在吃、喝、拉、撒、睡,换句话说要么睡要么醒着滴!众所周知,这只魔法喵很懒,和TT一样懒,它不能连续活动超过 B 个小时
2020-06-05 00:14:52
136
原创 【B - 东东转魔方】
题意:东东有一个二阶魔方,即2×2×2的一个立方体组。立方体由八个角组成。魔方的每一块都用三维坐标(h, k, l)标记,其中h, k, l∈{0,1}。六个面的每一个都有四个小面,每个小面都有一个正整数。对于每一步,东东可以选择一个特定的面,并把此面顺时针或逆时针转90度。请你判断,是否东东可以在一个步骤还原这个魔方(每个面没有异色)。思路:首先判断是否本身就是一个没有异色的模仿,如果不是的话,判断是需要怎么进行旋转,有三种大方向:上下,前后,左右,每个大方向有两个方向,判断旋转之后是否
2020-06-04 23:55:19
116
原创 【C - 拿数问题 II】
题意:给一个序列,里边有 n 个数,每一步能拿走一个数,比如拿第 i 个数, Ai = x,得到相应的分数 x,但拿掉这个 Ai 后,x+1 和 x-1 (如果有 Aj = x+1 或 Aj = x-1 存在) 就会变得不可拿(但是有 Aj = x 的话可以继续拿这个 x)。求最大分数。思路:首先我们用a数组来记录输入的数的个数,同时记录数的最大值和最小值。f[i]=max(f[i-1]f[i-2]+i*a[i]),最后输出一个最大分数.代码:#include<iostream&g
2020-06-04 23:50:05
127
原创 【B - LIS & LCS】
题意:东东有两个序列A和B。他想要知道序列A的LIS和序列AB的LCS的长度。注意,LIS为严格递增的,即a1<a2<…<ak(ai<=1,000,000,000)。思路:求LIS(最长上升子序列),使用两个for循环,一个用来遍历序列中的所有元素,一个用来遍历序列中这个元素之前的所有元素。以i为最大元素的子序列的最大长度,是所有以j为最大元素的子序列长度+1的最大值,两个循环之后,LIS就是所有最大长度的最大值。求LCS(最长公共子序列)时,:假设 f[i][j]
2020-06-04 23:44:32
214
原创 【C - 班长竞选】
题意:大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收集了M条意见,想要知道最高票数,并给出一份候选人名单,即所有得票最多的同学。思路:从图中找出所有强连通分量进行缩点,那么首先某一个强连通分量中的人获得了该强连通分量中节点数目减一得票数。他们还会获得其他与之相连的强连通分量的票数。计算出每个节点对应的连通分量:利用dfs计算出图的后序序列,根据逆后序序
2020-06-04 23:35:40
608
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人