- 博客(105)
- 收藏
- 关注
原创 判断点在线的哪里?
求出直线ab的斜率k,假设存在点D=(m,n)在ab直线上,且D的y值等于c的y值,即n = ly。此时可以通过斜率算出m,比较m与lx的大小,如果m>lx说明点在线的左边,小于则在右边,等于则在线上。已知三个点,a = (px,py),b=(qx,qy),c = (lx,ly),求相对于由a和b两点确定的一条直线,点c位于左侧还右侧。if (tmpx > p.x)//当tmpx>p.x的时候,说明点在线的左边,小于在右边,等于则在线上。给定的条件:三个点(最原始的数据)原理:主要利用直线的斜率k。
2024-04-22 11:17:57 96
原创 Leetcode111.二叉树的最小深度
这题和最大深度一样,直接后序遍历。但是需要注意的是,左子树或者右子树的为空的时候怎么办?那就直接取右子树或者左子树的结果,对为空进行条件判断。也可以精简代码,但是没必要。
2023-11-29 21:01:53 361
原创 Leetcode104.二叉树最大深度
是不是就是求根节点到叶子高度呢?最大深度,我第一时间想到层序遍历,遍历一层 ++计数器。所以这题求深度就该前序遍历是吧?深度:到 根结点 的距离--->前序遍历。高度:到 叶子结点 距离--->后序遍历。知识点:二叉树的 深度,高度。
2023-11-29 20:24:56 379
原创 Leetcode101.对称二叉树
这题其实就是判断二叉树是不是可以翻转,要是可以翻转并且翻转后和原来的树一样,就返回true,奈何代码没写出来。解法:二叉树后续遍历,传入左,右子树分别进行比较,分为内外侧分开比较。一定是先比较左右孩子结点。
2023-11-28 21:39:39 392
原创 Leetcode102.二叉树的层序遍历
二叉树的前中后序遍历--对应图中的深度优先---递归/迭代->栈。二叉树的层序遍历--对应图中的广度优先---迭代->队列。
2023-11-27 20:12:30 302
原创 Leetcode347.前k个高频元素
在c++中,堆的底层是用二叉树实现的,堆的有两种 大顶堆(根节点大于子节点),小顶堆(子节点大于根节点)。在c++中,堆实现的数据结构是 优先级队列。意思就是队列有优先级。priority_queue需要自定义排序大小。这个题目一看名字,马上反应过来要用堆的数据结构来解决。只要看到在大量数据中找频率,次数最多的前多少个元素,立马想到用堆。方法二:熟练运用stl。
2023-11-24 15:28:43 432
原创 Leetcode239.滑动窗口最大值
假装队列维护K个元素,其实呢,只需要维护队列出口的元素保持它永远是队列里面最大的元素就行,这就叫保持队列的单调性。这题挺难理解的,自己构建一个单调队列来操作维护入队的元素,始终保持单调。
2023-11-24 10:12:14 354
原创 Leetcode150.逆波兰表达式求值
逆波兰表达式就是 后缀表达式=====后序遍历---不考虑括号和优先级。先序遍历:先遍历根节点,再遍历左节点,最后遍历右节点;中序遍历:先遍历左节点,再遍历根节点,最后遍历右节点;后序遍历:先遍历左节点,再遍历右节点,最后遍历根节点;我们人类常用的就是中序遍历,需要考虑括号和优先级。这题就是后缀表达式,用栈实现。
2023-11-21 19:31:54 26
原创 Leetcode1047.删除字符串中的所有相邻重复项
用栈来做,首先对字符串进行遍历。若是栈为空或者栈顶元素不与其相等-->入栈。若是栈顶元素和字符串元素相等--->出栈。继续遍历,最后栈中元素即为剩下元素。
2023-11-21 17:14:00 16
原创 Leetcode225.用队列实现栈
这个题有意思嗷,两个队列 q1,q2 q1始终表示对栈的存储 q2表示入栈数的中转。始终把q2当作中转站。和Leetcode232.用栈实现队列两个题一起思考。考察对栈和队列的熟悉程度。
2023-11-19 21:36:11 36
原创 Leetcode232.用栈实现队列
明白队列的性质,然后两个栈,第一个用来进行插入操作,第二个用来进行pop peek操作。条件就是当要进行pop和peek操作,判断第二个栈是不是空,如果是空,把第一个栈的元素移动到第二个里面去。注意:判空的操作要判断两个栈是不是都为空。因为是两个栈实现队列,所以考虑两个。
2023-11-19 21:01:07 29
原创 Leetcode459.重复的子字符串
第一个解法:把字符串s 直接拼接 ss = s + s 掐头去尾后 若是ss中find()到s证明有重复的子字符串。find()函数 查找到直接返回子字符串首次出现的位置(索引)。如果未找到子字符串,则返回。第二种:kmp的解法,返回字符串的前缀表。要是满足 前缀表的最后一个值(s串的最长相等前后缀长度) 满足 s.size%(s.size - next(n-1)) == 0;怎么证明这个等式我也不会。
2023-11-18 19:33:04 19
原创 Leetcode28.找出字符串中第一个匹配项的下标
细节就是 i表示后缀末尾位 j表示前缀末尾位置(最长前后缀相等长度)最重要就是:j = next[j-1] 表示若是不匹配返回最初相等串的下标位置。前缀串 后缀串 前缀表 最长相等前后缀串长度 --搞清楚概念。查询函数中 查询字符串要从0开始匹配 最后返回下标即可。表示 前缀表的值 是 j的值。传入needle查询的字符串构建next数组。然后就是while中表示回退的下标。一眼kmp---字符串匹配算法嗷。首先构建 next前缀表。
2023-11-18 16:59:27 24
原创 Leetcode151.反转字符串中的单词
这道题,要分开来看。第一步,去除多余的空格,方法和去除数组中的数字一样,双指针法。fast表示遍历找到新元素,slow表示新数组要插入元素的位置。对了,处理了后要对字符串resize(n)空间。
2023-11-16 21:30:15 14
原创 Leetcode541.翻转字符串
这题,最关键在于遍历。谁说遍历一定要++i------------>可以 i +=2*k。这样处理起来很方便,不用考虑太多条件。
2023-11-16 12:36:10 12
原创 Leetcode18.四数之和
梦第二次破碎,这道题不能用哈希。和三数之和一样,需要双指针方法,简单来说就是再三数之和外面再套一层循环,难就难在剪枝和去重,简直折磨,究极折磨。
2023-11-15 20:18:43 14
原创 Leetcode1978.上级经理已离职的公司员工
新知识,子查询:可以查出表里所有的 employee_id当作一张新表,再用Employees表和新表进行镶嵌查询,只要manager_id不在新表的employee_id里即可。
2023-11-14 16:46:12 16
原创 Leetcode454.四数相加2
将a,b,c,d四个数组分成a+b 和 c+d两个模块。这样是不是很熟悉了?那就是plus版本的两数之和,不过要注意,现在map存储的是a+b出现的次数。这题首先得先想到用map,其次就是降低时间复杂度。
2023-11-14 16:18:59 20
原创 Leetcode1.两数之和
对于c++来说,返回类型是多个值,可以用{}来返回,就可以不用再开一个vector了。map到底存放什么?-----存放的是已经遍历过的元素,已经遍历过。有人相爱,有人看海,什么!还有人力扣第一题写不出来?
2023-11-14 12:52:20 14
原创 Leetcode349.两个数组的交集
只要看到有检查重复值,第一反应--------------------哈希(数组,set,map)自己写的数组法(看起来复杂,但是完全没用set和map)
2023-11-14 10:34:51 16
原创 Leetcode142.环形链表
这题用快慢指针来做的话需要强大的数学推理能力。挺难的,不过对于有环的链表思路应该就是快慢指针。代码如下,数学推理省略。也不简单,要对哈希的容器很熟悉才行,比如说set自动排序,且不能有重复的。还有set的接口set.count()---0/1。其实还可以哈希的方法做,就比较简单了,但是时空复杂度是O(n),而双指针空间是O(1)。
2023-11-13 11:26:56 11
原创 Leetcode19.删除链表倒数第n个结点
还是一样,加一个虚拟头节点统一删除操作。还有就是找准删除结点的前面一个结点。这个题简单,可以遍历知道个数,再操作。不过我推荐双指针做法,看起来高级。
2023-11-12 20:59:45 48
原创 Leetcode24.两两交换链表中的结点
注意嗷,是交换节点,不是交换节点的值。所以嗷,应该是改变指针的方向,和leetcode翻转链表那个题目一样,改变指针指向。还有就是想清楚断掉指针的时候,考虑后续操作,有必要的时候需要创建新指针保存一下。最后,一般操作链表的题目,都是得先找到操作结点前面的值。所以,虚拟头节点很有必要!
2023-11-11 21:20:51 17
原创 Leetcode1789.员工的直属部门
用了union联合查询,将一个问题分成两个子问题。union联合查询会自动去除重复选项,如果想全部显示,使用 union all连接。
2023-11-10 21:23:15 25
原创 Leetcode206.反转链表
第一种想法,借用一个栈来解决。用栈存储数据,再拿出来赋值。第三种操作,递归写法(根据双指针写出来的)第二种操作,双指针+临时空间。
2023-11-10 19:39:14 15
原创 Leetcode707.设计链表
一般情况,对链表的操作都最好加一个虚拟头节点,这样对头插,头删除比较好操作。对于链表的增删都是从待操作结点的前面结点发起的动作。
2023-11-10 18:44:34 14
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人