- 博客(22)
- 收藏
- 关注
原创 深度优先遍历---记忆化搜索
首先,先利用暴搜找到利用递归的代码思路,然后展开决策树,看是否可以将其化为记忆化搜索,接着将其化为动态内存管理。记忆化搜索:相当于在递归中进行一次剪枝,并且这个剪枝可以大大优化我们的算法,可以形象地将其称为。先把每一个位置的最长子序列的长度得到,在遍历过程中用一个变量接受最大的那个值。循环--递推--递归--dp(动态内存管理)--记忆化搜索--矩阵快速幂。要得到到五角星位置的路径等于其左边的叉的路径再加上其上边的叉的路径。并不是所有的递归(暴搜,深搜)都可以改成记忆化搜索。本质上并没有任何区别。
2024-09-26 19:00:24
1136
原创 floodfill算法(1)
给出三个整数sr,sc,和color,从像素image[i][j]开始对图像进行上色填充,为了完成上色工作,从初始像素开始,记录初始坐标的上下左右四个方向上相邻且同色的像素点,接着再记录与这些像素点相邻且同色的新像素点......重复此过程,将所有有记录的像素点的颜色改为color,最后返回经过上色渲染后的图像。基本思路:先进行一次遍历,找到为‘1’的位置,然后进入到递归中,将其周围的为‘1’的位置全部变为‘0’,递归回来后再将岛屿的数量加上1。1:画出决策树(与之前的题目基本一致,故省略)
2024-09-19 20:54:45
495
原创 算法4-----综合训练(4)
首先,设立两个数组:int dx[4] = {0,0,1,-1};int dy[4] = {-1,1,0,0}如果单词存在于网格中,返回true,不然,返回false。注意:单词必须按照字母顺序,通过相邻的单元格内的字母构成,同一个单元格内的字母不可以被重复使用。将这当前位置的坐标分别加上这两个数组进行的遍历,就可以轻松得到当前位置上下左右四个位置的坐标。与上一题的单词搜索思路基本一致,防止重复的方法变为了要将原先的单元格进行改变。1:画出决策树(与上一题基本一致,为避免重复,在此省略)
2024-09-18 17:47:01
511
原创 算法4-----综合训练(3)
在dfs函数中,需要将数独进行遍历,然后在空的位置,将1~9这几个数字判断一下是否可以填进去,之后因为只存在唯一的一个解法,所有还要对当前位置没有数字可以填进的情况,直接返回false,避免程序出现bug。类似于全排列的思路,不过不需要path数组,只需要统计优美排列的个数即可。需要先将数独遍历一遍,将那三个数组初始化,接着再进行dfs函数的设计。同有效数独这一题全局变量一致,需要三个来标记当前位置的bool数组。三:有效的数独(本道题不牵扯回溯,主要利用哈希表的知识)
2024-09-16 19:03:09
550
原创 算法4-----综合练习(2)
当给出n = 4,k = 2时,可有以下的排列:{1,2} {1,3} {1,4} {2,3} {2,4} {3,4}给出一个整数数组和一个整数,向整数数组中的元素前加上“+”,或者“-”,使得最后的结果为哪一个整数,输出有效的组合方法的个数。给出一个整数数组nums[1,2,1],target = 3;所有的组合为:{1,2},{3},{1,1,1}字符串s = “a1l”,总共的组合有:“A1l”,“A1L”,“a1L”,“a1l”vector<vector<int>> ret;
2024-09-14 21:03:45
691
原创 算法4-----综合训练(1)
给出字符串digits[2,3],表示出来的所有字符串为:“ad”,“ae”,“af”,"bd",“be”,“bf”,“cd”,“ce”,“cf”按照之前不含有重复数字的方法,我们可以得到所有的全排列,但是会存在重复,可以利用剪枝,减去多余的情况!首先,要将字符串数组与要进行排序的字符串进行映射,得到它们之间的关系,可以用一个全局变量数组搞定。题目:给出一个只包含2~9的字符串,返回所有它能表示的字母组合,每一个字符有着各自的映射。当位置等于digits的长度时,可以将path加到ret的后面,然后返回。
2024-09-13 22:09:51
856
1
原创 算法3----穷举&暴搜&回溯&剪枝
给出一个数组nums[1,2,3],返回其所有的全排列为[1,2,3],[1,3,2],[2,3,1],[2,1,3],[3,1,2],[3,2,1].(表示每一条排列,将其记录在path中,再由path放进ret中)(标记位置,看是否被使用过·,从而决定是否要使用该条路径)dfs(nums,pos)(pos表示位置,当前位置该从何处进行枚举)选的话:path+=nums[i],dfs(nums,i)int[][] ret;(表示最终要返回的所有排列)int[][] ret;
2024-09-12 20:34:14
405
原创 算法(2)----二叉树的深搜
非叶子节点表示逻辑词,叶子节点表示对错, 二叉树又为完整二叉树,要得到整个二叉树的布尔值,要先从最下面开始,得到每个非叶子节点左右子树的布尔值,适用于后序遍历。思路:使用中序遍历,用一个值存放前一个节点的值,分别得到左右子树的值,再将根节点与之进行比较,如果大小关系符合就返回true,不符合返回false。给一个二叉树的根节点,此外每个节点的值为要么为1,要么为0,返回移除了所有不包含1的子树的原子数。从根节点开始,一直传着节点的值,若遇到叶子节点节点,则这条路径借宿。
2024-09-08 15:34:22
705
原创 String的介绍以及重点解析
字符串长度的返回:size(),len()(两者返回的均为字符串的长度,为了保持后面容器的泛性,常 使用size())size_t find(const string& str, size_t pos = 0)(从某个特定位置查找特定字符串,并返回其位置)string& insert(size_t pos, const string& str)(在固定的位置前头插一个字符串)
2024-07-23 23:19:57
1086
原创 算法(1)----递归
题目:有三个柱子,分别为A,B,C,起初A柱子上有着按照大小顺序堆放的盘子,编写一个代码使得A柱子上的盘子全部转移到C柱子上。若N = n,先把n-1个盘子 移动到B,再将最大的盘子移动到C,最后再将B上的n-1个盘子移动到C。第一个节点保持不变,将后面的n-1个节点进行倒置,返回值用新节点接受,之后要将头结点连接进链表。若N = 3,先把两个盘子移动到B,再将最大的盘子移动到C,最后再将B上的所有盘子移动到C。若N = 2,先把一个盘子移动到B,然后把最大的盘子移动到C,最后将B上的盘子移动到C。
2024-06-08 22:49:15
972
原创 数据结构----链表以及队列
(任意位置插入)(要分前后)删除:对链表进行删除时,要对节点的空间进行一个一个的释放,也要传二级指针。在进行头插时,头结点的位置一直在改变,故传参也要二级指针,在进行插入时,要注意判断链表是否为空。PS:在进行插入时,创建新节点的步骤重复率高,可以单独写一个创建新节点的函数,简略代码。在进行尾插时,头结点在链表为空的情况下,也要改变头结点的位置,故而也要传参二级指针。
2024-05-08 20:34:35
1240
1
原创 C++内存管理
原因:使用new的时候有时会多开空间存放要创建的对象个数,提醒后面要进行调用析构函数的次数,但往往返回值会往后移四个字节,此时如果使用free会造成内存泄漏。PS:一般情况下,new对所创建的不进行初始化,但是可以自己手动对其进行初始化,并且操作符除了用法方便,与C的用法无太大差别。delete p2;用法:new+类型(初始化的值)/ new+类型[个数]{要初始化的值}(2)C语言的动态申请内存是使用函数,而C++使用的是两个操作符。最好C语言的和C语言的配套使用,C++的和C++的进行配套使用。
2024-04-30 10:03:55
252
1
原创 C++语法------类和对象(3)
特性:在我们不写的情况下,编译器也会自动调用初始化列表,自定义成员则会去自动调用其默认构造函数,内置类型若给了缺省值,直接调给初始化列表将其进行初始化,否则不做处理。(通俗理解,类有了一个朋友,这个朋友可以到类的家里来玩,可以玩类家里的东西),但是类不可以去访问友元中的成员,因为类并不是该函数的友元。所有成员都可以在初始化列表中初始化,也可以在函数体中进行初始化,那么什么情况下只可以使用初始化列表呢?(2)在进行初始化时,要单独地在外部对其进行初始化,因为它是存储在静态区中的。
2024-04-26 12:28:56
378
1
原创 C++代码实现----日期类
1:每个月的天数不一样,可以有一个函数专门来实现得到每个月的天数(直接在类中实现,已经默认是内联函数,(内联函数声明和定义不可以分离))(1)传参为年份与月份,根据年份要对是否是闰年二月的天数进行判断1,根据月份直接得出该月的天数。使用的是“进位”的思想,每个月满了该月的天数将月份进行加1,满了12个月将年份进行加1.(2)日期加减等天数:Date operator+/-=(Date b)(2)创建数组存放每个月的天数,利用直接用数组对应的位置进行返回。(3)使用内联函数,进行月份的判断,得到天数。
2024-04-24 22:41:52
302
原创 C++语法-----类和对象(2)(2)
由于在函数结束时,函数栈帧会被销毁,而如果使用传引用返回,会让其成为一个类似于c语言中的野指针一样的东西,因为它指向了一个已经被销毁了的空间。PS:注意区分拷贝构造和赋值重载,拷贝构造是在类进行声明时对其进行拷贝初始化,而赋值重载是对于一个已经存在的类进行赋值。在进行函数调用(此时为一般情况)的时候,返回值可以为直接为类,也可以为类的别名,两者的区别是什么?(由于本人使用的是Vs2022版本,编译器优化,效果不明显,故无代码截图)拷贝的是临时对象,析构的是原先对象,返回的是临时对象的拷贝。
2024-04-23 13:57:20
414
原创 C++语法-----类和对象(2)(1)
(在写代码时,如果使用传值传参,编译器也会直接报错)。如果是浅拷贝,那么类b与类a中的_arr为同一地址,那么在析构时会进行两次析构,改变b中的同时也会改变a中的,无法达到我们预期中的效果。当我们不写时,编译器会自动生成析构函数进行调用,处理情形与构造函数一致,对内置类型不做处理,自定义类型调用其析构函数。自定义类型调用其的无参的构造函数,即为默认构造函数,主要有三类:无参构造,全缺省构造,编译器自动生成的构造。PS:在进行调用的时候,如果没有参数,不需要加括号,有参数时,一定要加括号!
2024-04-22 17:42:00
976
1
原创 C++类和对象(1)
既然类调用的都是同一个函数,为什么函数可以对于不同的传参进行不同的处理,原因是在传参的过程中,编译器默认地把对象的地址也传过去了,作为this指针。ps:简单来说,可以将类理解为c语言中的结构体的优化,c++中也可以实现结构体。private:不可以直接在类的外部进行调用,但可以直接类的作用域中进行使用。简单而言,就是将类在main函数中进行声明时,其类中的成员变量就已经被实例化。Ps:在计算类的对象大小时,只计算类的成员变量,不计算类的成员函数。在C++中也可以对于类中的成员函数进行声明和定义的分离。
2024-04-19 22:46:25
311
1
原创 C++----语法(1)
命名空间是一块自己的私有的空间域,在里面可以定义函数,对象等等,创立一个命名空间之后,若对象名与局部对象相同也不会发生冲突。Ps:对于自定义的命名空间不可以随意展开,若含有好几个同名对象,会让编译器不知道到底该调用哪一个!前言:(1)c++兼容c语言,是对c语言的一个优化,可以用c语言实现的代码,一定也可以用c++实现。2:原先对象未被const修饰,别名被const修饰,可以,造成权限的缩小而已。引用的权限只可以缩小,不可以放大!1:对于已被const修饰的对象,不可以再对其进行引用,会造成权限的放大。
2024-04-18 22:09:17
864
1
原创 C语言分支与循环-2
总结:while 与for循环均属于出口循环,而do while 属于入口循环,在使用时一定要注意!循环结构:while循环,for循环,do while循环。for(初始化变量;}while(条件语句)while(条件语句)(3)do while循环。例子均为打印1~100.(1)while循环。
2023-10-31 15:57:27
87
1
原创 C语言分支与循环-1
2 选择结构:分有多种情况,并且有着不同的路径进行实施的结构,主要分为两种:(1)if else 语句;(2)switch 语句。一 顺序结构:一般而言,程序按照顺序执行的结构就叫做 顺序结构。(2) switch结构(注意!表达式结果必须为整形常量!基本结构:switch(表达式)若后面跟着多个语句一定要用{}将其括起来!基本结构:if(判断条件)顺序结构,选择结构,循环结构。(1)if else语句。
2023-10-31 15:57:09
70
1
原创 从scanf函数角度看输入
字符串:scanf()会读取除了空白字符以外的所有字符。首先跳过空白开始读取第一个非空白字符,直到遇到一个空白字符。注意:当把字符串放进数组时,它会在末尾加上'\0'!整数:%d转换说明输入一个整数,scanf()跳过所有空白字符,希望找到一个整数,遇到后从此处读取,直到读到非整数字符为止,并把该字符放回输入,下一次读取就从该字符开始读取。例如:%x识别十六进制数,浮点数的输入小数,指数计数法(e计数法),p计数法。字符宽度:scanf函数会在字段结尾或第一个空白字符处停止读取(strlen)
2023-10-22 23:32:38
87
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅