- 博客(30)
- 收藏
- 关注
原创 数据结构与算法学习day23-回溯算法-递增子序列、全排列、全排列||
给你一个整数数组nums,找出并返回所有该数组中不同的递增子序列,递增子序列中。你可以按返回答案。数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
2024-09-24 23:33:07
748
2
原创 数据结构与算法学习day22-回溯算法-分割回文串、复原IP地址、子集、子集||
在处理组合问题的时候,递归参数需要传入startIndex,表示下一轮递归遍历的起始位置,这个startIndex就是切割线。
2024-09-22 17:33:24
819
原创 数据结构与算法学习day21-回溯法-组合、电话号码的字母组合、组合总和、组合总和II
path这个数组的大小如果达到k,说明我们找到了一个子集大小为k的组合了,在图中path存的就是根节点到叶子节点的路径。然后还需要一个参数,为int型变量startIndex,这个参数用来记录本层递归的集合从哪里开始遍历,防止取到重复值。回溯法的搜索过程就是一个树型结构的遍历过程,在如下图中,可以看出for循环用来横向遍历,递归的过程是纵向遍历。函数里一定有两个参数,既然是集合n里面取k个数,那么n和k是两个int型的参数。本题没有数量要求,可以无限重复,但是有总和的限制,所以间接的也是有个数的限制。
2024-09-18 23:44:21
904
原创 数据结构与算法学习day21-二叉树-从中序与后序遍历序列构造二叉树、最大二叉树
需要找出左右子树的后序数组。中序数组和后序数组的左右子树长度一定是相等的。根据中序切割出来的左右子树的数据长度,再切后序数组,切出后序数组的左右子树。一层一层切下去,每次后序数组最后一个元素就是节点元素。
2024-09-12 20:17:10
502
原创 数据结构与算法学习day20-二叉树的最大深度、最小深度、完全二叉树的节点个数、平衡二叉树、二叉树所有路径
后序(左右中):先求左子树的高度,再求右子树的高度,最后取左右深度最大的数值 再+1 (加1是因为算上当前中间节点)就是目前节点为根节点的树的深度。,那么在这里递归的时候,如果为空就不进行下一层递归了。因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进path中。如果当前传入节点为根节点的二叉树已经不是二叉平衡树了,还返回高度的话就没有意义了。使用迭代法的话,使用层序遍历是最为合适的,因为最大的深度就是二叉树的层数。是当 cur不为空,其左右孩子都为空的时候,就找到叶子节点。
2024-09-08 15:45:04
1475
原创 数据结构与算法学习day19-翻转二叉树、对称二叉树
因为我们要比较的是根节点的两个子树是否是相互翻转的,进而判断这个树是不是对称树,所以要比较的是两个树,参数自然也是左子树节点和右子树节点。本题遍历只能是“后序遍历”,因为我们要通过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。此时才进入单层递归的逻辑,单层递归的逻辑就是处理 左右节点都不为空,且数值相同的情况。把以上情况都排除之后,剩下的就是 左右节点都不为空,且数值相同的情况。对于二叉树是否对称,要比较的是根节点的左子树与右子树是不是相互翻转的,3.确定单层递归的逻辑。节点为空的情况有:(
2024-09-01 23:16:16
747
原创 数据结构与算法学习day18-层序遍历
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现,
2024-08-28 23:39:16
694
原创 数据结构与算法day17-二叉树的递归遍历、二叉树的迭代遍历
写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。先序遍历是中左右,后序遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了。:在递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要结束了,所以如果当前遍历的这个节点是空,就直接return。
2024-08-26 23:23:51
837
原创 数据结构与算法day17-二叉树基础知识
满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。如下图所示。
2024-08-26 22:00:37
537
原创 数据结构与算法学习day12-字符串
给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。样例输入:a1b2c3。
2024-08-11 16:59:03
1002
原创 数据结构与算法学习day11-哈希表-赎金信、三数之和、四数之和
接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,需要注意的是,left和right的去重操作需要在找到结果时才能进行操作,不然会导致{0,0,0,0,0}这种数组无法找到对应结果。与上面同理,nums[left]与nums[left+1]比较,nums[right]与nums[right-1]比较。判断nums[i]与nums[i+1]还是与nums[i-1]相同去重呢?
2024-08-07 23:27:53
962
原创 数据结构与算法学习day10-哈希表-快乐数、两数之和、四数相加 II
对于 A 和 B,我们使用二重循环对它们进行遍历,得到所有 A[i]+B[j] 的值并存入哈希映射中。对于哈希映射中的每个键值对,每个键表示一种 A[i]+B[j],对应的值为 A[i]+B[j] 出现的次数。那么判断元素是否出现,这个元素就要作为key,所以数组中的元素作为key,有key对应的就是value,value用来存下标。当遍历到 C[k]+D[l] 时,如果 −(C[k]+D[l]) 出现在哈希映射中,那么将 −(C[k]+D[l]) 对应的值累加进答案中。用对应的value值、插入值。
2024-08-04 20:15:09
1096
原创 C++ STL容器学习
博主写的很好,容易入门:C++之STL容器详解(包含十种常用容器)-优快云博客C++ STL总结 | 行码棋 (wyqz.top)C++进阶-STL容器,你看我就够了 - 简书 (jianshu.com)
2024-08-02 16:48:13
182
原创 数据结构与算法学习day09-哈希表-有效的字母异位词、两个数组的交集
std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。那看一下如何检查字符串t中是否出现了这些字符,同样在遍历字符串t的时候,对t中出现的字符映射哈希表索引上的数值再做-1的操作。因为字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。再遍历字符串s的时候,
2024-07-31 23:43:30
524
原创 数据结构与算法学习day08-环形链表II
可以使用快慢指针法,分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。假设慢指针走满了一圈,快指针已经跑完一圈到下一圈了,因此,它们只能在慢指针的第一圈里相遇。从相遇节点 再到环形入口节点节点数为 z。因为快指针以2节点的速度走,所以相对于慢指针以1节点的速度接近,因此有环一定会相遇。,n为fast指针在环内走了n圈才遇到slow指针, (y+z)为 一圈内节点的个数A。
2024-07-31 09:03:39
479
原创 数据结构与算法学习day07-删除链表的倒数第N个节点、链表相交
求出两个链表的长度,并求出两个链表长度的差值,然后让curA移动到和curB 末尾对齐的位置。此时我们就可以比较curA和curB是否相同,如果不相同,同时向后移动curA和curB,如果遇到curA == curB,则找到交点。否则循环退出返回空指针。
2024-07-30 00:14:58
507
原创 数据结构与算法学习day06-设计链表、翻转链表
1.题目没有给head这个指针,则不需要操作 2.直接用虚拟头结点即可操作 3.链表长度需要增加。1.cur指针需要先指向虚拟头结点,为了防止链表为空!2.链表长度需要增加。1.cur指针需要先指向虚拟头结点,为了找到插入位置前一个节点。对于直接读取函数,实现时直接让指针指向该位置就行。(释放指针内存后需要定义为空指针,防止成为野指针。
2024-07-28 22:19:35
481
原创 VS2019 编译出现 E0282的错误解决方法
前提:很久没有用过vs2019,且前段时间手贱删了一些文件,导致编译很简单的代码都报大面积错,主要是E0282。
2024-07-26 00:19:03
451
原创 数据结构与算法学习day05-移除链表元素
做题过程中需要注意的点:1.头部需要用while循环一直判断,这样放置新的头部元素也为目标元素 2.不能操作空指针!//现在它是新的头结点,因此当我们要找目标元素时,需要找到前一个元素指针。= NULL && head->val == val){//不能操作空指针。(这个方法就是用原来链表的头结点,所以需要考虑头节点,是否是目标元素,是的话要把head这个指针往后移动)//不能返回虚拟头指针。//用while循环可以一直判断头部和新头部元素是否为目标值。//其他链表元素,需要找到目标元素的前一个链表指针。
2024-07-26 00:12:41
666
原创 数据结构与算法学习day03-数组有序数组的开方、长度最小的子数组、螺旋矩阵||
在暴力解法中,是一个for循环滑动窗口的起始位置,一个for循环为滑动窗口的终止位置,用两个for循环 完成了一个不断搜索区间的过程。窗口的起始位置如何移动:如果当前窗口的值大于等于s了,窗口就要向前移动了(也就是该缩小了)。每画一条边都要坚持一致的左闭右开,或者左开右闭的原则,这样这一圈才能按照统一的规则画下来。窗口的结束位置如何移动:窗口的结束位置就是遍历数组的指针,也就是for循环里的索引。所以 只用一个for循环,那么这个循环的索引,一定是表示滑动窗口的终止位置。i指向起始位置,j指向终止位置。
2024-07-21 15:24:52
374
原创 数据结构与数据结构与算法学习day02-数组二分法查找、移除元素
因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。要知道数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。第一种写法,我们定义 target 是在一个在左闭右闭的区间里,区间的定义这就决定了二分法的代码应该如何写,时间复杂度为O(n^2)
2024-07-18 23:11:23
476
1
原创 wos数据基于CiteSpace 6.2.R6简单分析
在wos检索好数据,导出plain text file数据。导出full record数据,一次最多只能导出1000条,多于1000条数据需要多次导出。保存为txt文件。
2023-12-27 23:06:23
6987
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅