- 博客(33)
- 收藏
- 关注
原创 蓝桥杯-后缀表达式
个人听了答案后的理解,排序,然后只减去最小值并把其他都改为绝对值后相加。题意:选m个加号,n个减号,m+n+1个整数,组合最大的数是多少。你会发现根本不需要理解什么是后缀表达式 and 中缀表达式。
2024-03-27 21:46:52 215
原创 蓝桥杯-包子凑数
定理:a和b的公约数是与t有关系,关系是__gcd(a,b)==1表示能凑出的数有无限个,__gcd(a,b)>1表示能凑出的数是有限个。求有限个数方法:做标记设dp[0]=1 0是一定能凑出来的数,然后将包子种数都遍历一遍。题意:n种包子数,哪些数是n种包子数凑不出来的,例如:2,3可以凑出5,但是不能凑出1。裴蜀定理:ax+by=t,该等式中a,b表示包子数,x,y表示倍数,t表示可以凑出的数。由此可得:当__gcd(a,b)>1直接打印 INF 结束,反之求有限个数。
2024-03-27 20:30:52 198
原创 蓝桥杯-修改数组
大佬思路(不是我的,我是傻子):将1~1e6都存进set<int> hashset中,然后用set::lower_bound查找nums[i]这就避免了O(n)的时间复杂度,最后再hashset.erase(nums[i])这题我最多能得90分而已,我的思路:创捷bool arr[1e6+1]={false},如果遍历过了arr[nums[i]]=true。
2024-03-23 16:17:14 230
原创 蓝桥杯-全球变暖
我的思路:把所有岛屿坐标放入二维数组中,也就是说当你发现‘#’时,你就要把上下左右的#放入二维数组[i].push_back(make_pair(x,y))中,最后在遍历二维数组中岛屿陆地有多少陆地被淹没,如果被淹没数等于岛屿陆地总数,则res+=1。这题我没想到我能一遍过,所以特地写一篇文章炫耀一下。
2024-03-23 10:25:37 128
原创 蓝桥杯-幸运数 and 有奖问答
第二题,我刷背包问题刷成傻子了一直往背包问题思考,后面实在不行我就换了思路。第二题答案:4165637。第一题不做赘述,直接上代码。第一题答案:4430091。
2024-03-18 18:27:54 218 1
原创 动态规划-一维01背包
01背包:有一个背包体积为V,有n个物品体积为volume,价值为value[i]第一问,背包不超过V的情况下,能装下物品的最大价值是多少?第二问,背包刚好装满的情况下,能装下物品的最大价值是多少?由于有n个物品,第i个物品只有选or不选两种情况。1.【模板】01背包(牛客网)-ACM模式。一下题目都是leetcode。
2024-03-18 10:58:07 246 1
原创 动态规划-两个数组
在这里说明,我写的斐波那契数列模型是依托答辩,不建议看。这段时间比较懒,所以子数组,简单的多态,这几个会在最后写。如果心细的你还会发现(最长回文子序列)这题与1,2题相似。这些开胃小菜也就吃完了,我们开始真正的修行把。两个数组也是让我头脑发烫的难题。这题非常有意思对吧。
2024-03-16 21:29:16 148
原创 动态规划-斐波那契数列模型
一位数决定一个字母,两位数依然决定一个字母:相当于:dp[i]=dp[i-1]+dp[i-2]。剩余的就是判断边界条件,当个位为0时表面dp[i]不能接收dp[i-1],这也表明了当两位数小于10或者大于26也不能接收dp[i-2]。在几个月前我就在尝试学习动态规划,但是由于我的智力有限始终不懂。如今我重新开始学习动态规划,该文章是笔记。由于斐波那契数列模型我只写一篇文章,下面的题目我都不会讲解,但是写完这些题,让我受益匪浅。结尾:所有的斐波那契数列都是dp[i]=dp[i-1]+dp[i-2]
2024-03-16 20:04:16 203
原创 动态规划-回文串
这题跟模板答案关系不大,模板答案只是优化该题思路的一部分,因此不能把模板答案当作主菜(提醒自己)回文串让我身心疲惫,因此先总结回文串。回文串模板题==模板答案。中代码为什么是模板答案。在这两题中你会明白,
2024-03-14 17:26:44 183
原创 动态规划-路径问题
在地下城游戏中你会发现如果用从上往下and以i,j为结尾的方法。你需要考虑的地方太多了顾虑不过来。如果直接从终点开始找负数最大值最后到达起点,那么这题将会简单的多。路径问题的思路可以分为以i,j为起点 or i.j为结尾。而以i,j为结尾时最为简单的也是最为常见的。我本打算写一篇斐波那契数列模型,可我写的依托答辩也就没发表了。1.不同路径 1 and 2。
2024-03-13 22:21:27 190 1
原创 cpp笔记map和set
map存在着pair<const key_type,mapped_type> ,而set存着key,但是他们用着同一颗红黑树,用的就是模板的魅力.map和set的实现难点在于,他们都是使用红黑树为载体,实现map和set两并不相同的数据结构。结束,我没写operator--,自己试试吧。话不多说先看代码:Mymap。
2023-08-26 16:29:30 102 3
原创 cpp笔记红黑树
思考:为什么满足上面的性质,红黑树就能保证:最长路径中节点个数不会超过最短路径节点个数的两倍?情况一:cur和parent为红,grandfather为黑,uncle存在且为红。搜索二叉树,节点中加了颜色,不是红色就是黑色,书中最长路径不能超过最短路径的2倍。3、对于每个节点,从该节点刀其他所有后代叶节点的简单路径上均包含相同数目的黑节点。5、每个叶子节点都是黑色的(此处的叶子节点指的是空节点)情况三:uncle存在,且为cur在parent的右边。3、如果一个节点是红色的,则它的两个还是节点是黑色的。
2023-08-26 15:28:26 61
原创 用迭代模拟前序、中序、后序的递归
第一次循环从根节点5出发,进入while(cur)后一直往左迭代5->3->1->0->nullptr,从stack中弹出0,cur=0->right==nullptr,第二次循环cur是空,进入不了while(cur),直接cur=1->right==2。top=1,top->right==2,cur=top->right==2,第三次循环cur=cur->left==nullptr,记录2,弹出栈。2、遍历右子树,对根节点出栈,向右跳转,根->right。语言无法形容该过程,我们先看代码再加深理解。
2023-08-21 17:33:36 64 1
原创 leetcode中的二叉树题
前序的第一个元素一定是根节点,在中序中找到根节点,根节点的左边为左子树全部元素,右边为右子树全部元素。层遍历,第一想法毫无疑问就是用队列存储每一层的数据,实际解决方案其实也是如此。情况二:p、q分别在左右两侧,直接返回根。情况一:p、q其中一个是根本身则直接返回。情况三:p、q都在左边或者都在右边。
2023-08-20 23:20:04 43 1
原创 cpp搜索二叉树
你会发现如果使用中序遍历(左,根,右)则会是一个升序的有序数组。最后也是最难的一个函数实现,因为他需要考虑非叶子节点被删除后得用父节点链接它的子节点。搜索二叉树,树如其名:他的作用就是如同二分查找一样,是为了查找数据的一个数据模型。为何会出现在搜索二叉树的内部,这就不得不说一下他的数据结构。我的悟性极低导致了我在学该章节时,出现了严重的大脑停滞。将比上一节点大的值放到它的右边,且用右指针链接。比上一节点小的值放到它的左边,且用左指针链接。搜索二叉树的难点:不使用递归完成树的形成。
2023-08-20 21:28:09 45 1
原创 多态和虚函数(下)_深度解读
原因:进入最老的父类,如何看class D :public B, public C是先继承B后继承C的所以后面是进入B然后是C最后才是到D的构造函数所以答案为A。而缺省值为1的原因是虚函数重写(覆盖):会将父类中的函数接口覆盖住子类中的函数名,因此在调用B类时会调用A类的函数名和缺省值,但是使用B类内容打印。原因是Derive中的存储结构为前4个字节是Base1的地址,之间4个字节是Base2的地址,最后4个字节为Derive中int类型的地址。不构成多态:调用的指针类型是谁就调用谁的析构函数。
2023-08-19 19:10:08 37
原创 多态和虚函数(上)_深度解读
我们先前提到了虚函数,而虚函数再创建后也就会在相对应的类中生成虚表,如果类中有10个虚函数,那么虚指针也就会有一个虚表(如同指针数组)元素[0]记录着第一个虚函数的地址,元素[1]记录着第二个虚函数的地址,以此类推。监控窗口中显示了无论是Base还是Derive都仅有子类的虚函数元素,但真实的内存中仅存有子类的虚函数吗。实际上子类存储着自己的虚函数地址,而子类不仅有自己的虚函数地址还有继承下来的虚函数。该文章主要讲述了多态的概念,多态的形成条件,虚函数的原理(虚表)。
2023-08-19 17:18:15 41
原创 继承(简单易懂)
如果直接使用菱形继承,会导致student和Teacher都有Person的属性,例如一个研究生他即是学生又是助教,但是他只有一个姓名,而非虚继承的会有两个名字导致数据冗余或二义性,当你使用虚拟继承后就可解决该问题,先看代码。补充一些知识:在父类中public表示对子类和类外公开,protected表示对子类公开但是对子类和自己以外私有,private表示仅对自己公开,子类和类外为私有、多继承:一个类有两个或以上直接父类时称中国继承关系为多继承。单继承:一个子类只有一个总结父类时称这个继承关系为单继承。
2023-08-16 10:51:59 39 1
原创 stack、queue和priority_queue的底层实现
stack和queue被称为适配器容器,原因正是因为他们的底层并没有自己实现,而是用vector,list和deque等,下篇我将介绍deque容器。
2023-08-14 20:49:40 89
原创 让stack熟练使用的题
解题思路:由于栈的数据结构,在需要弹出的数据时必然是栈顶数据,也就是刚刚才push进入栈中的,也就是说当弹出栈,栈顶的数值与栈顶相同时,压入栈就pop,不同时就push(没错思路就是如此简单)解题思路:这题是用栈存储操作数,当遇见操作符时栈顶为右值,然后pop,栈顶为左值,接着pop比如操作符为 ‘ + ’,那么也就是 left + right。解题思路:设立两个栈其中一个正常装入数据,另一个只在空的时候装入或者有小于等于这个栈的top时push进入。下面是链接,链接下一个就是解题思路和代码答案。
2023-08-13 16:27:35 39 1
原创 cpp中的list(下)
我们想到析构函数可以用多个erase()函数来清理干净,但是用于清理空间的成员函数不仅仅只有析构函数,因此我们单独写出一个clear()来表示多个erase()1、在迭代器类中的任何成员函数只用写一个即可,不用像class list一样需要写非const版本和const版本两种,使得代码更加精简起来。2、将迭代器独立封装起来可以更好的区分迭代器可以做的行为(迭代器相关函数)和非迭代器可以做的行为,为了更好的理解。const_iterator中的const T*和Ptr的关系也是互通的。
2023-08-12 17:19:17 136 1
原创 cpp中的list(上)
在string,vector和list中最为复杂的就是list,我想正是因为cpp中的list与c中的list区别导致我有些头昏欲裂吧,话不多说我吗开始解析list的基础框架。__list_iterator& operator++()//前置++,跳转到下一节点。__list_iterator& operator++(int)//后置++__list_iterator& operator--(int)//后置--__list_iterator& operator--()//前置--
2023-08-11 21:24:49 143 2
原创 cpp中的vector
c语言中的顺序表也就是cpp中的vector,但vector用指针的方式存储数据,同时vector中可以同时存储多个自定义类型例如:vector或者vector来书写对象,现在我将带你了解基本的底层实现。
2023-08-10 22:15:50 433 1
原创 深入理解计算机系统.第一章(上)全是干货
逻辑上存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组的索引),这些地址是从零开始的。字:个人理解为每次计算机抽取的数据位个数,例如64位机器的字就等于8个字节,32位机器的字就等于4个字节。3.汇编器:hello.s -> hello.o(将代码标准库中的函数一同改为 文件.o 例如printf.o)每行代码后都以一个看不见的文本字符‘\n’结束,该文本字符对应的整数为10.想图中的hello.c文件。代码的本质是ASCII码,每一个文本字符都有对应的整数值,以c语言为例,如图1.1.
2023-04-28 11:29:34 91 1
原创 反转链表(力扣206)
无论方法一还是二,都是让指针的next指向反方向,方法一为防止n2指向n1后丢失n2后面的地址,使用设计出n3来记录n2->next,防止找不回导致下一步无法实施。此题需要学过数据结构单链表的基础才能看懂大概,废话不多说上题目。输入:head={1 ,2 ,3 ,4 ,5 },请你反转链表,并返回反转后的链表。输出:head={5,4,3,2,1}
2023-03-30 20:12:33 53 2
原创 多次循环训练题
之后两天(第二天和第三天),每天收到两枚金币,之后三天(第四、五六天),每天收三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币。假设有N盏灯(N为不大于5k的正整数),从1到N按顺序依次编号,初始时全部处于开启状态;有M个人(M为不大于M的正整数)也从1到M依次编号。第一个人(1号)将灯全部关闭,第二个人(2号)将编号为2的倍数的灯打开,第三个人(3号)将编号为3的倍数的灯做。(即将打开的灯关闭,将关闭的灯打开)。依照编号递增顺序,以后的人都和3号一样,将凡是自己。输入:N=10 , M=10。
2023-03-24 12:10:15 59
原创 删除有序数组中的重复项
设置3个变量用于定位元素位置,用prev和cur来判断是否相同,相同时移动到下一位,寻找到不同时把prev放入指针中重新存储,当到达最后一位时cur指向的是野指针无法访问且内容位随机值,因此prev和cur的比较也就失去了意义,也就可以直接将prev的元素翻入dest中。设置两个指针,a指针的目的是找出与val不相同的元素,而b指针的目的则是当a指针找到目标元素是可以记录下来。输入:nums=[1 ,2 ,2 ,2 ,3 ,3 ,4 ,5 ,5 ,5 ,6 ]出现一次 ,返回删除后数组的新长度。
2023-03-22 21:13:28 47
原创 a++和++a的区别
由于++是有影响a的值的副作用,且判断谁大时a和b都++,在得出b更大时,b为先引用后++,所以max赋值的b只++了一次就被引用了为12.而a只被++一次所以为11.b被++两次所以为13。第一次赋值给b时,先是b=a后面再a=a+1,所以b=10。在第二次赋值给b是++a时 是先a=a+1后面再b=a。由于a已经被连续两次++所以b=12.因为+1没有++的副作用(改变变量的值),所以max=12,a=10,b=11,在进行编程时为避免错误可以尽量使用+1来减少++所带来的副作用和运算量。
2023-03-19 20:35:28 138
原创 剑指offer:数组中数字出现的次数
重复数字字异或为0,不重复数字异或的二进制不同部分为1,相同部分为0。再判断不重复数字二进制不同部分具体在哪。接着用二进制不同部分的具体位置来分组。对分组异或,由于分组部分只有一个不重复的数字用0异或完后只剩下目标数字了。题目:一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。输入{ 4,1,4,6 }
2023-03-19 20:34:48 72 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人