自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(14)
  • 收藏
  • 关注

原创 C++学习笔记-贪心算法

就是摆动序列里元素的个数。

2023-06-27 09:41:47 176 1

原创 C++学习笔记-回溯算法(2)

到现在为止,已经学习了回溯算法的组合、分割、子集、排列问题。组合、分割、子集问题中,组合都是无序的,[1,2]和[2,1]是相同的结果,所以前面取过1之后,后面就不能再取1了,那么就需要startIndex(不全是这样,如果是从不同的集合中取元素、相互之间不影响的话,也不需要)。但排列问题中[1,2]和[2,1]是不同的结果,所以前面取过1之后,后面可以再取,就不需要startIndex了。但是因为要避免同一树枝上把相同的元素取两遍,所以需要used数组来标明哪些元素已经用过了。去重。

2023-06-15 09:18:49 174

原创 C++学习笔记-回溯算法(1)组合问题

如果used[i-1]= 0(false),说明在这一树枝上没有用到candidates[i-1],那么就是在candidates[i]相同层的前一个元素出现了相同的,used[i-1]= 0是因为是从前一个树枝回溯到这的,所以就是树层重复了,那么candidates[i]就不能再被选取了。本题中,需要用到的参数是给定的两个整数n和k,还有用来防止把同一个元素取了两次的startIndex,保证下一层的递归从上一层递归已经用过的元素后面的元素开始。,这部分必不符合要求,就不用再递归了。

2023-06-08 09:14:55 463

原创 C++学习笔记-二叉树(4)

2.要删除的节点是叶子节点,左右孩子均为空,直接删除即可,然后返回NULL给上一层,因为要删除的本身就是叶子节点,删了之后上一层就变成新的叶子节点,所以用root->left或root->right接收NULL是正确的;5.要删除的节点左右孩子均不为空,可以把左子树并到右子树上,也可以把右子树并到左子树上,是一样的,选一种即可。具体方法是使用两个指针,比较前后元素是否相同(根据题目中给出的性质,相同的元素一定是相邻的),如果相同,就count+1,不同的话count=1。那就不设置最大值了,

2023-05-31 21:00:30 121

原创 C++学习笔记—二叉树(3)

数值即可。从左向右遍历,每一层的第一个节点必是该层的最左节点。如何实现“最后一层”?每迭代一层,结果更新一次,最后返回的就是最后一层。

2023-05-20 10:04:39 132 1

原创 C++学习笔记-二叉树(2)

函数参数除了接收传入的节点之外,还需要一个vector<int>类型的数组来存放路径的节点(用vector是因为回溯的时候比较方便),还需要一个vector<string>类型的数组来存放符合要求的带->的最终结果。因为是从下往上遍历,中间节点的高度需要参考左右孩子的高度,所以是先求左右孩子高度,再向上返回结果计算中间节点的高度。因为代码的逻辑实际上是求根节点的高度,根节点的高度就是二叉树的最大深度,所以用的是求高度的后序遍历。,因为要通过左右孩子(即内侧和外侧节点)的比较结果,来判断这两棵子树是否对称。

2023-05-12 17:31:21 114

原创 C++学习笔记-二叉树(1)

递归的过程中,如何算是递归结束了呢,当然是当前遍历的节点是空了,那么本层递归就要结束了,所以如果当前遍历的这个节点是空,就直接return。跟最大深度不同的是,最大深度要把所有层都遍历完才能得出结果,而在最小深度,只要检测到某个节点的左右孩子都为空(即叶子结点),直接返回深度。前序是先将中间的节点交换,注意交换的时候会带着各自的孩子节点一起交换,然后再以同样的逻辑处理左子树,最后再以同样的逻辑处理右子树。前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,中序和后序同理。

2023-05-08 17:22:36 114

原创 C++容器

(set(集合容器)/multliset(多重集合容器)),(map(映射容器)/multimap(多重映射容器))(stack(栈)/queue(队列)/priority_queue(优先级队列))可以从末尾快速地插入与删除元素,快速的随机访问元素。但vector,删除之前需要用empty判断是否为空。

2023-04-24 21:07:00 47

原创 C++学习笔记-栈和队列

四个问题:1.C++中stack和queue是容器吗?不是,它们是。

2023-04-23 20:14:29 204

原创 C++学习笔记-字符串

如果前一个字符的前缀表的数值是i,就把模式串下标移动到下标i的位置继续比较。判断字符串s是否由重复子串组成,只要两个s拼接在一起,里面还出现一个s的话,就说明是由重复子串组成。前缀表的任务是当前位置匹配失败,找到之前已经匹配上的位置,再重新匹配,此也意味着在某个字符失配时,3.然后利用双指针法,一个从新的数组末尾开始,一个从旧的数组末尾开始,从后向前替换空格。思路:双指针,一个从数组开头往后走,一个从数组结尾往前走,挨个互换元素即可。,这样避免在s+s中搜索出原来的s,我们要搜索的是中间拼接出来的s。

2023-04-14 19:57:11 40

原创 C++学习笔记-哈希表

std::set和std::multiset底层实现都是红黑树,std::unordered_set的底层实现是哈希表, 使用unordered_set 读写效率是最高的,并不需要对数据进行排序,而且还不要让数据重复,所以选择unordered_set。如果nums[i]+nums[left]+nums[right]

2023-04-10 20:00:35 372 2

原创 C++链表部分

链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。重新定义两个指针,一个指针从头节点出发,一个从相遇的节点出发,各走一步,下一次相遇的地方就是环的入口节点。双链表有两个指针域,一个指向下一个节点,一个指向上一个节点。链表的长度可以是不固定的,并且可以动态增删, 适合数据量不固定,频繁增删,较少查询的场景。数组在定义的时候,长度就是固定的,如果想改动数组的长度,就需要重新定义一个新的数组。

2023-04-05 19:42:55 141 1

原创 c++数组部分

数组可以方便的通过的方式获取到下标下对应的数据。数组内存空间的地址是连续的。数组元素不能删除,只能覆盖。C++中,二维数组在内存的空间地址是连续的。

2023-03-31 19:58:26 959

原创 时间复杂度

O(1)常数阶 < O(logn)对数阶 < O(n)线性阶 < O(nlogn)线性对数阶 < O(n^2)平方阶 < O(n^3)立方阶 < O(2^n)指数阶。(2)冒泡排序:假设有N个量,最好情况是执行N次,最坏情况是执行(N*(N+1))/2次,则时间复杂度为O((N*(N+1))/2)=O(N*2).(1)二分法查找:假设有N个量,最好情况是一次就找到,最坏情况是算法执行了log(2)N次,则时间复杂度为O(log(2)N)=O(logN)但数据用例不一样时,时间复杂度也是不同的。

2023-03-25 16:47:50 438 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除