- 博客(17)
- 收藏
- 关注
原创 LeetCode贪心算法
如果 ratings[i] > ratings[i + 1],此时candyVec[i](第i个小孩的糖果数量)就有两个选择了,一个是candyVec[i + 1] + 1(从右边这个加1得到的糖果数量),一个是candyVec[i](之前比较右孩子大于左孩子得到的糖果数量)。如果ratings[i] > ratings[i - 1] 那么[i]的糖 一定要比[i - 1]的糖多一个,所以贪心:candyVec[i] = candyVec[i - 1] + 1。再确定左孩子大于右孩子的情况(从后向前遍历)
2024-11-21 15:50:29
1906
原创 LeetCode回溯算法打卡
情况就不同了,本题明确要求只会分成4段,所以不能用切割线切到最后作为终止条件,而是分割的段数作为终止条件。循环中 [startIndex, i] 这个区间就是截取的子串,需要判断这个子串是否合法。递归调用时,下一层递归的startIndex要从i+2开始(因为需要在字符串中加入了分隔符。startIndex一定是需要的,因为不能重复分割,记录下一层递归分割的起始位置。pointNum表示逗点数量,pointNum为3说明字符串分成了4段了。),同时记录分割符的数量pointNum 要 +1。
2024-11-14 18:37:06
1840
原创 LeetCode二叉树打卡(重点题目)
那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。题目中说了输入的数组大小一定是大于等于1的,所以我们不用考虑小于1的情况,那么当递归遍历的时候,如果传入的数组大小为1,说明遍历到了叶子节点了。将删除节点(元素7)的左孩子放到删除节点(元素7)的右子树的最左面节点(元素8)的左孩子上,就是把5为根节点的子树移到了8的左孩子的位置。
2024-11-11 22:05:16
2141
原创 LeetCode二叉树(基础)
注意上面最后一种情况,我没有使用else,而是else if, 因为我们把以上情况都排除之后,剩下的就是 左右节点都不为空,且数值相同的情况。因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。参数就是要传入节点的指针,不需要其他参数了,通常此时定下来主要参数,如果在写递归的逻辑中发现还需要其他参数的时候,随时补充。此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。节点为空的情况有:(
2024-11-08 14:00:26
844
原创 LeetCode二叉树打卡(二叉树的遍历)
1.由于递归的实现就是:每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中,然后递归返回的时候,从栈顶弹出上一次递归的各项参数,所以在迭代法中,我们也用栈实现树的遍历2.栈遵循先进后出的原则,因此我们在进行前序遍历时我们要先将根节点压入栈中,pop之后再将右左节点压入栈中,这样我们就能得到根左右的遍历结果。
2024-11-01 11:10:14
613
原创 LeetCode栈和队列打卡
例如:4 + 13 / 5,这就是中缀表达式,计算机从左到右去扫描的话,扫到13,还要判断13后面是什么运算符,还要比较一下优先级,然后13还和后面的5做运算,做完运算之后,还要向前回退到 4 的位置,继续做加法,你说麻不麻烦!那么将中缀表达式,转化为后缀表达式之后:["4", "13", "5", "/", "+"] ,就不一样了,计算机可以利用栈来顺序处理,不需要考虑优先级了。再多说一些代码开发上的习惯问题,在工业级别代码开发中,最忌讳的就是 实现一个类似的函数,直接把代码粘过来改一改就完事了。
2024-10-29 00:27:05
983
原创 LeetCode哈希算法打卡
两层for循环就可以确定 a 和b 的数值了,可以使用哈希法来确定 0-(a+b) 是否在 数组里出现过,其实这个思路是正确的,但是我们有一个非常棘手的问题,就是题目中说的不可以包含重复的三元组。把符合条件的三元组放进vector中,然后再去重,这样是非常费时的,很容易超时,也是这道题目通过率如此之低的根源所在。去重的过程不好处理,有很多小细节,如果在面试中很难想到位。时间复杂度可以做到O(n^2),但还是比较费时的,因为不好做剪枝操作。//双指针算法/*时间复杂度: O(n^2)
2024-10-25 02:35:17
828
原创 螺旋矩阵 II
这里每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画,即左闭右开原则。这样能保证在循环时不容易混乱。求解本题要坚持循环不变量原则(规定一种不变的循环方式,在这里我们选择左闭右开的原则)。
2024-10-18 22:07:45
191
原创 STL初识
pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用。Stack所有元素的进出都必须符合“先进后出”的条件,只有Stack顶端的元素,才有机会被外界取用,Stack不提供遍历功能,也不提供迭代器。
2024-10-18 14:08:57
678
原创 长度最小子数组
得到前缀和之后,对于每个开始下标 i,可通过二分查找得到大于或等于 i 的最小下标 ,使得 sums[最小下标]−sums[i−1]≥s,并更新子数组的最小长度(此时子数组的长度是 (最小下标−(i−1)))。暴力法是最直观的方法。初始化子数组的最小长度为无穷大,枚举数组 nums 中的每个下标作为子数组的开始下标,对于每个开始下标 i,需要找到大于或等于 i 的最小下标 j,使得从 nums[i] 到 nums[j] 的元素和大于或等于 s,并更新子数组的最小长度(此时子数组的长度是 j−i+1)。
2024-10-18 13:59:48
452
原创 c++部分重难点
p = 30;// p指向的地址是一定的,但其内容可以修改常量指针(const int* p)常量指针本质上是一个指针,常量表示指针指向的内容,说明该指针指向一个“常量”。
2024-10-17 18:40:40
701
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅