- 博客(114)
- 收藏
- 关注
原创 【无标题】
首先是定义一个MyLinkedList的结构用来管理链表,里面有两个元素一个是*node类型的virhead,虚拟头节点virhead.next指向的是链表的实际头节点。Get函数内,首先需要判断索引是否有效,大于链表长度或小于0(当前链表下标从0开始)都是无效的。再定义一个node类型的结构体,表示节点,里面有一个val和一个next。直接返回一个MyLinkedList类型的node节点,val值为0。直接遍历链表直至目标索引,返回当前索引的val即可。
2024-09-20 17:39:54 145
原创 203.移除链表元素
判断当前节点指向的下一个节点的val值是否为给定Val,如果是,则将当前节点的next指向下一个节点的next,也就是virtual.Next = virtual.Nexr.Next。根据题意创建出一个虚拟头节点,Next指向当前链表的头节点。如果不是,则将当前节点的next赋值给虚拟头节点。遍历该链表,直至末尾。
2024-09-20 12:42:38 190
原创 Goland滑动窗口
维护一个最小的滑动窗口,需要判断这个窗口的sum值是否大于给定的target,如果不大于则一直往数组右方元素累加至大于或等于target值即可。大于或等于时,则需要得到当前滑动窗口的长度,判断是不是长度最小的滑动窗口,如果是则将该窗口长度赋值给result变量用于返回。如果不是则需要减掉滑动窗口最左侧的元素,代表滑动窗口最左则的元素为i,则i++代表了滑动窗口最左则元素减少。减小掉了窗口最左则的元素,那么滑动窗口总值sum也要减去元素的值,所以也就是sum -=nums[i]如果不是则返回result。
2024-09-19 22:01:02 340
原创 Golang中map数据结构字段解析
hmap其中最重要的就是,它指向了一个包含多个结构为bmap(桶)的bucket数组*,bucket的底层采用链表将bmap链接起来。[]bmap是一个底层数组,我们把它称之为 桶(哈希桶) ,暂时可以理解为用于存放map键值对以及其他的数据元素因为哈希冲突的原因,所以一般[]bmap数组只存放一个指针,该指针指向一个链表用于存放键值对。
2024-03-15 23:45:33 1021
原创 1005. K 次取反后最大化的数组和
思路:先把数组排序好,然后直接从下标0(最小的负数)开始反转,那么接下来有两种情况:1.负数反转完了,k还有剩余。此时因为nums内全部都是正数,所以我们只需要将nums再次排序,然后反复对nums[0]进行k此反转即可。2.负数还没反转完,k没有剩余了。此时直接遍历nums每个元素进行累得出和即可。
2023-11-26 22:00:52 680
原创 122.买卖股票的最佳时机 II
题目要求的是返回最大利润。那么只需要把一天和前一天的利润值进行判断,只要是正数利润就相加就可以了,再返回,那就是最大的利润值。又因为需要和前一天判断 所以第一天是肯定没有利润的,下标就从1开始。
2023-11-25 19:07:54 432
原创 491.递增子序列
如果子序列为空且nums[i]的值小于序列的最后一个值(不满足要求),或者nums[i]在uset中出现过,那么就跳过本层的该元素,因为该元素在之前使用过。遍历所有结点,并且遍历一个就将path给push进result中,因为每增加一个结点就代表有一个新的子序列。将每层使用过的元素添加进uset中,代表本层后面不能再使用相同元素。要考虑去重 所以使用unorderedset uset。
2023-11-22 17:41:43 55
原创 78.子集
然后就是for循环的横向遍历,每次将结点的值push进path中,然后进入一次递归就push进一次result中,因为要将所有可能的子集都收集。当startIndex这个枚举遍历大于nums.size()的数组长度时,则代表终止递归。退出回溯时需要将path容器的元素pop_back。
2023-11-22 16:41:53 44
原创 216. 组合总和 III
原题链接:[216. 组合总和 III(https://leetcode.cn/problems/combination-sum-iii/submissions/483547922/)但是需要在进行一次判断,如果sum等于题目给定的targetSum,则代表是需要的值 将path给push_back进result中即可。终止条件方面,依旧是path.size() == k 时,就终止。回溯时要注意,sum要进行 -i,并把path给pop_back。
2023-11-20 22:44:37 336
原创 450. 删除二叉搜索树中的节点
第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点。第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点。第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点。第一种情况:没找到删除的节点,遍历到空节点直接返回了。
2023-11-15 14:37:30 50
原创 701. 二叉搜索树中的插入操作
因为是二叉搜索树,我们可以利用这个特性来确定val到底是在那一边的子树,而不是全部遍历二叉搜索树。直接使用递归,如果查询到root为NULL,则直接创建新结点即可。
2023-11-15 14:32:27 58
原创 501. 二叉搜索树中的众数
频率count 大于 maxCount的时候,不仅要更新maxCount,而且要清空结果集(以下代码为result数组),因为结果集之前的元素都失效了。如果 频率count 等于 maxCount(最大频率),当然要把这个元素加入到结果集中(以下代码为result数组)遍历有序数组的元素出现频率,从头遍历,那么一定是相邻两个元素作比较,然后就把出现频率最高的元素输出就可以了。而且初始化的时候pre = NULL,这样当pre为NULL时候,我们就知道这是比较的第一个元素。二叉搜索树,必然是有序的。
2023-11-14 19:18:35 50
原创 530.二叉搜索树的最小绝对
因为是二叉搜索树,根据他的特性,直接递归中序遍历获取所有元素,成为一个有序数组。因为是有序数组,所以其实求相邻两个值的差值是不是最小值即可。然后在有序数值内进行双指针递归遍历即可获得最小差值。
2023-11-14 18:55:29 71
原创 98. 验证二叉搜索树
有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。然后只要比较一下,这个数组是否是有序的,注意二叉搜索树中不能有重复元素。要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。可以递归中序遍历将二叉搜索树转变成一个数组。
2023-11-13 22:43:02 157
原创 700. 二叉搜索树中的搜索
如果大于则将root = root ->left ,如果小于则root = root ->right即可。利用这个特性,只需要判断结点的val是否等于题目给定的val,如果等于则返回该结点。这就决定了,二叉搜索树,递归遍历和迭代遍历和普通二叉树都不一样。若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉搜索树。给定的就是一个二叉搜索树。
2023-11-13 21:42:44 107
原创 617.合并二叉树
在root1的树上进行修改,root1的结点的val值应为root1 ->val + root2 ->val。将root1 和roo2的左右子树分别传入 进行递归(此时递归内使用的应是子结点)先判断两棵树那颗是空的,如果其中一棵树空,则返回另一颗树。
2023-11-13 21:33:38 64
原创 106. 从中序与后序遍历序列构造二叉树
通过后序找到树的根节点,然后再通过中序进行左右子树确认,切割。然后通过递归不断的进行寻找与切割,直到遇到叶子结点为止。
2023-11-12 12:12:52 76
原创 513. 找树左下角的值
此时直接使用层序遍历,记录最后一层最左边的值就可以了 也就是最后一层的que.front();那么如何判断是最后一层呢?其实并不需要进行判断,只需要在进行每层的层序遍历时,将result = que.front()也就是每层的最左边一个元素即可。找出二叉树的 最底层 最左边 节点的值。
2023-11-12 10:20:17 77
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人