
数据结构算法学习
文章平均质量分 58
本专栏为自己每天练习写代码所作,每天至少更新一个代码,以督促自己写代码~
Pluviophile_miao~
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
剑指 Offer II 004. 只出现一次的数字
注意:本题与主站 137 题相同:https://leetcode-cn.com/problems/single-number-ii/给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次。请你找出并返回那个只出现了一次的元素。链接:https://leetcode.cn/problems/WGki4K。nums 中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次。输入:nums = [0,1,0,1,0,1,100]输入:nums = [2,2,3,2]原创 2022-10-05 17:00:42 · 96 阅读 · 0 评论 -
剑指 Offer II 001. 整数除法
给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’。注意:整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231−1]。本题中,如果除法结果溢出,则返回 231 − 1输入:a = 15, b = 2输出:7。原创 2022-10-05 16:58:39 · 129 阅读 · 0 评论 -
牛客网动态规划练习专项版二(C++)
在第3天(股票价格 = 2)的时候买入,在第6天(股票价格 = 7)的时候卖出,最大利润 = 7-2 = 5 ,不能选择在第2天买入,第3天卖出,这样就亏损7了;1:采用压栈的方式,左括号入栈,右括号则对当前栈内进行判断,为空怎么样,不为空怎么样,最后使用res进行记录,记得不要忘记设置start为-1即遍历的前一个,同时入栈的是序号而不是左右括号。如果 str10~i-1 已经编辑成了 str20~j-1,只需要将 str1i 替换为 str2j 可以完成转换,代价为 dp[i-1][j-1]+rc。原创 2022-09-12 13:44:49 · 138 阅读 · 0 评论 -
牛客网动态规划练习专项版一(C++)
a. 如果两种跳法,1 阶或者 2 阶,那么假定第一次跳的是一阶,那么剩下的是 n-1 个台阶,跳法是 f (n-1);如果 s [i-1] == ‘0’,dp [i] = 0,否则 dp [i] = dp [i-1];如果 s [i-1] == ‘2’&& s[i]原创 2022-09-12 00:29:46 · 173 阅读 · 0 评论 -
oj练习1
1:学会了多组string输入,原创 2022-09-09 16:34:57 · 150 阅读 · 0 评论 -
最小生成树(prim算法和Kruskal算法)(C++)
,所以这里想要用最大距离作为判断的时候,直接写INT_MAX,会都赋值为-1,这里采用,都设置成0x3f的方法,最终和它define的INF进行比较,若相等则代表并不能生成最小生成树~1:学到了关于memset(vis,0,sizeof(vis));初始化函数的使用,只有设置成0,才是都初始化为0,其他的如果写10,并不会像我们理想状态都设置为10 的(2:关于vectora作为函数参数的调用方法自己还是不是很会,只能设置成全局变量,希望在未来的学习中可以知道是为什么?原创 2022-09-05 23:25:52 · 330 阅读 · 0 评论 -
无向带权图求两个节点之间的最短路径(C++)
1:大概应该好像学会了dijkstra算法,首先依据给的节点之间的关系建立双向映射,然后依次从起点起开始遍历,每个节点只能遍历1次,找到依据当前节点从初始位置到达下一位置是否会变小,如果变小了则说明路径较好,入队列,同时最小堆的好处可以使得对于每一个元素,取到的都是最小值更新好的避免了很多次的重复比较。原创 2022-09-05 16:13:26 · 1880 阅读 · 0 评论 -
图的遍历应用(C++)
1:这是自己做的第一道图的题,感觉好像和自己学习中学到的C语言写的图有丢丢区别,原来可以使用位置i表示一个节点,然后vector数组中的元素值表示节点连接的位置,这样也表示出来了一个图的样子,然后使用深度优先搜索添加路径,因为最开始已经有一个固定的值0,所以在最开始提前添加,然后仍然通过,循环和递归的方法实现回溯添加路径(这里自己好像感觉,如果想要获得路径的话,就要使用循环和递归的方法,单纯的递归有时好像会出现数组空等的问题)解释:总共有 2 门课程。并且学习课程 0 之前,你还应先完成课程 1。原创 2022-09-05 16:00:47 · 644 阅读 · 0 评论 -
双队列实现栈&&最小栈&&逆波兰式(力扣C++)
解法二:class MinStack { /* * 思路:每次入栈 2 个元素,一个是入栈的元素本身,一个是当前栈元素的最小值 * 如:入栈序列为 2-3-1,则入栈后栈中元素序列为:2-2-3-2-1-1 * 用空间代价来换取时间代价 */ private Stack stack;tokens[i] 是一个算符(“+”、“-”、“*” 或 “/”),或是在范围 [-200, 200] 内的一个整数。输入:tokens = [“10”,“6”,“9”,“3”,“+”,“-11”,“著作权归领扣网络所有。原创 2022-09-02 11:44:55 · 90 阅读 · 0 评论 -
两数相加(C++)
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即,xn )。商业转载请联系官方授权,非商业转载请注明出处。商业转载请联系官方授权,非商业转载请注明出处。商业转载请联系官方授权,非商业转载请注明出处。不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。输入:l1 = [2,4,3], l2 = [5,6,4]解释:2-2 = 1/22 = 1/4 = 0.25。输入:l1 = [0], l2 = [0]原创 2022-09-01 22:43:26 · 688 阅读 · 1 评论 -
大根堆小根堆(C++)
1:学习了如何建堆,以及如何使用堆进行排序,一般使用堆排序都是先建立一个初始堆,然后再一点一点遍历排序,如果想要升序则建立大根堆,想要降序排序,建立小根堆。2:比较重点需要掌握的知识:建堆的时候如果数组的下标是从0开始,则第一个要调整的元素为length/2-1,同时每一个节点的左孩子是2。i+2这点需要注意一下!(因为有的时候会采取以节点数目为判断进行建堆等处理,下标是从1开始~)大根堆和小根堆的建立过程,区别就是在于调整堆的时候谁在上面,谁在下面~...原创 2022-08-31 12:16:05 · 1337 阅读 · 0 评论 -
栈、队列牛客网(C++)
2:统计一下该题的方法使用优先队列,队列中一直要排序的就是留下最小的值,采用大根堆的方法,队头是最大的元素,对每一个新来的元素如果其小于队里最大的元素,它就可以入队,队里那个即将要第一个出去的元素就出去,遍历完所有元素之后就可以得到队列的就都是最小的元素,而队首要出去的第一个元素就是第K小的元素,队内的元素都是所求的!3:如果要找最大的K个元素,就要采用小跟堆的方法,使得队头是最小的那个,对每一个新来的元素进行比较,如果其比队头大,那么它就可以入队列,最后遍历结束后,队首也是那个第K大的元素!...原创 2022-08-30 18:45:12 · 322 阅读 · 0 评论 -
归并排序(C++)
1:参考归并排序实现统计数组中逆序对数的方法,通过一个函数实现了归并排序是方法,代码相对来说比较简洁~原创 2022-08-29 20:59:51 · 219 阅读 · 0 评论 -
N皇后问题(C++)
1:这道题也是一个很经典的题,统计可以有的摆法数,对每一列依次进行深入判断,如果达到了最终的n的深度,摆法数+1,返回,后续的循环继续,只要对应的位置符合条件就可以摆放,然后再继续深入判断~,明白了原理之后个人觉得递归最重要的就是之间传递的参数,拿些参数会随着递归的深入有影响并返还回去。...原创 2022-08-29 20:21:14 · 419 阅读 · 0 评论 -
递归牛客网(C++)
1:同样是使用递归的方法,但是这次的递归是在每次递归的时候查找对应的前后左右是不是1,是1就代表是一堆把一堆的所有1都变成0,每次的双重循环就是查找位置,从第1次找到一个独立的1开始把相邻的都变成0以后,继续返回查找新的独立的1,这样子就可以把所有的独立的1的个数统计出来就是岛屿的数量~~,这种找到并修改值的算法也是一种思路!一定不要忘记首先排序,另外int型vector初始化的方法vector...原创 2022-08-29 20:07:51 · 139 阅读 · 0 评论 -
哈希牛客网(C++)
1:这道题应该比较容易想到,遍历两遍数组,一次是统计每个元素出现的次数,另一次就是找到其中出现次数为1的元素并进行记录,记得排序,感觉map和基本的数组好像使用起来也没有什么 区别,大概是具体的大小可以随便控制这里有丢丢不同~......原创 2022-08-29 18:24:01 · 166 阅读 · 0 评论 -
牛客网排序题(C++)
i++)这里的里面的if3次判断,刚开始一直不懂为什么是这样,后来理解了过后发现真的是巧用,会节省好多代码,此外关于归并排序的应用自己还要再理解理解,稍微懂其中的一点原理,但是还是不能自己手写出来一个归并排序,归并融合递归解这道题对于初次学这种题的自己还是有些难度的,但是也体会到了写代码有的时候不知道为啥,但是真的可以背下来经典的代码,相信随着时间的流逝自己会理解的~如果中间值小的话,那么就修改right为中间值,进行靠拢!...原创 2022-08-29 18:09:24 · 269 阅读 · 0 评论 -
链表牛客网中等、较难题(C++)
8:多个头节点有的时候就是为了维护同一个链表,所有通常情况下都是不对head直接进行操作的,需要进行保留,只要少部分递归的情况需要直接用head,再者就是pre节点,最后返回pre->next的问题,虽然最开始定义的是pre->next=head, cur=head但是并不代表最终运算完返回pre->next还是等于head了,因为head会一直不变,但是pre->next也许会根据实际情况为空也是可能的,还是要看代码编写情况再确定!1:这道题不是自己写的,题解用递归的思想实现,很方便,自己也理解了~...原创 2022-08-26 23:21:40 · 661 阅读 · 0 评论 -
链表牛客网简单题(C++)
1:这道题最开始自己的想法是先统计一下有多少个节点,然后再重头遍历到n-k个,但是相比于答案的一个快链表一个慢链表,直到快链表遇到结尾停止,慢链表就是所求位置的方法,会慢一些时间,这也可以理解为用空间换时间吧~原创 2022-08-20 21:15:26 · 348 阅读 · 0 评论 -
序列化与反序列化二叉树(C++)
1:又巩固了一遍二叉树的创建过程已经先序遍历输出的过程(遇到的一个小问题就是在创建二叉树的时候判断直接进行返回了没有进行root=NULL:的赋值,这里最开始弄得还不是很透彻。3:对字符串的相关操作更加熟悉了一些,以及地址(*str)++等的操作和**str的意思等~(后期还要继续巩固使用)2:在使用to_string()函数的时候报错了,因为了编译器不支持的问题,参考了网上的博客进行了修改~......原创 2022-08-15 12:36:49 · 375 阅读 · 0 评论 -
二叉树与双向链表&&重建二叉树&&输出二叉树的右视图(牛客网C++)
1:学会了根据先序遍历和中序遍历创建二叉树~(或许可以自己尝试一下已知中序和后序遍历的结果创建应该是什么样子的)1:学会了用递归遍历的方法遍历二叉树并和链表相结合~2:练习了用层次遍历的方法统计最右面的右视图~2:能够自己默写下来并进行后期的应用~1:将前面学到的建树方法进行应用~...原创 2022-08-15 12:29:22 · 312 阅读 · 0 评论 -
判断是不是二叉树搜索树&&在二叉树中找到两个节点的最近公共祖先&&按之字形顺序打印二叉树(力扣C++)
1:这题最开始自己是想要或许可以使用双向队列根据层次进行判断的,但是后来发现原来可以直接遍历之后依据层次之间翻转就可以了,就觉得这就简单多了(有时间或许可以试一下双向队列的方法多多练习嘛~)1:二叉搜素树有一个特点,不仅是便于搜索,而且中序遍历的值都符合前一个小于后一个的特点,如果不符合就不是,因此可以使用递归的方法进行实现。1:收获还是递归吧,感觉递归的思想解决问题很简单,但是真的很抽象,希望自己可以多理解理解吧~2:又温习了一遍层次遍历创建树的过程,记得赋值NULL。4:有关递归又有了更深的理解~...原创 2022-08-14 00:18:42 · 91 阅读 · 0 评论 -
牛客网简单题二叉树(训练2)
这道题分别求路径,然后再重新遍历找到最后一个相同的点是我没想到的,因为忽略了二叉搜索树的本质即找到一个值的路径只能有一条~,这点自己没想出来。这道题学会的一个是将以后的知识进行应用,自己会求最大深度,但是就是没会双层利用,判断每一个二叉树的左右子树的深度并进行判断是不是平衡二叉树。摆出一个大神的解法,真的佩服~(代码简化任重而道远,先学会思路吧)......原创 2022-08-12 19:41:21 · 1457 阅读 · 0 评论 -
牛客网二叉树简单题(训练1)
这道题的求解很巧妙,最开始我想的是先求其镜像树,然后再依次遍历有点像入栈的意思,以相同的顺序遍历查看是否每一个位置是否相同(还没有具体实现,估计思路应该差不多,当时没有想到递归&&flase的值可以永远传递这个思想,有时间可以试一下)这道题主要是记得创建一个新节点,然后对其左孩子和有孩子分别递归赋值,最后返回的思想。这道题的思想与上一题的差不多都是创建新节点递归赋值返回~就是刚开始的判断有丢丢区别。学习这种将sum值传下去,递归return相减的方法。有关基本二叉树的创建查看。......原创 2022-08-12 18:37:43 · 251 阅读 · 0 评论 -
二叉树的创建(内含层次遍历创建、递归创建方法)(C++)
2:二叉树的递归和层次遍历都是刚开始判断第一个节点是否为空则可以确定该树是否为空,但是中序和后序遍历创建的时候不可以,因为先要找到最左部才是第一个访问节点(这里本来的理解有错误,之前以为递归创建是先序创建,后来发现还是理解为递归的形式比较好,因为已知先序、中序、后序遍历任何一种方法都无法明确一棵树的形状)是一个意思,即层次遍历和前序遍历创建的时候都需要注意(使用树的其他节点left和right的时候都需要先把树创建完成)...原创 2022-08-12 16:35:22 · 559 阅读 · 0 评论 -
判断是否是满二叉树、完全二叉树以及二叉树的最大深度(两种方法)和最小深度(C++)
1:自己又默写了一遍二叉树的创建流程,相比于昨天顺利了许多,但是还是有一些小细节自己没有记牢,比如判断空指针的时候把-1加了个引号,使得输入一直没有停止,以及忘记给root->val赋值,真的要时常温习~=nullptr的判断,在codeBlock对应的编译器会报错,这个要注意需要一定的配置,这里没有进行配置就稍微更改了些思路。2:重写了层次遍历的算法解决了对应的判断是否是满二叉树、完全二叉树的例子,对层次遍历有了更深的理解~.........原创 2022-08-10 15:49:11 · 330 阅读 · 0 评论 -
二叉树的层次遍历、前序遍历、中序遍历、后序遍历(C++)
最开始并不明白为什么有的地方是*,有的地方是&,‘&’的意义是什么呢?后来学习之后才发现是引用的意思,即对&符号后面变量的操作等同于对前面的操作,可以直接对值进行改变,一改以往必须设置对应的指针才会真正改变其中的值(还有需要注意的是如果对自己创建的结构struct要使用&的话,需要在前面加上typedef才可以。2:遇到的问题是最开始对树的创建方式void并不知道具体是什么意思,以为是按照层次遍历的方法输出的树,仔细一研究才发现是先序遍历输入的树(这里可以研究一下层次遍历创建树怎么创建?..........原创 2022-08-09 19:36:10 · 819 阅读 · 0 评论 -
二维数组中的查找
在一个二维数组 array 中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。1:如果直接对数组进行双重遍历的话必定不符合时间复杂度会超时,所以这里依据数组的特点从左下角开始遍历,如果大于待查找值,则对应的行减少;数据范围:矩阵的长宽满足0...原创 2022-08-09 11:08:06 · 91 阅读 · 0 评论 -
二分查找~
给定一个 元素升序的、无重复数字的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标(下标从 0 开始),否则返回 -1。3:输入的时候判断,if(cin.get()==‘\n’)要在后面判断不要在前面,这个自己已经犯过很多遍错误了,下次要注意~的方法,nums后面如果没有参数的话就不要nums()了,自己比较爱犯的一个错误~数据范围:0...原创 2022-08-09 09:05:05 · 84 阅读 · 0 评论 -
最长理想子序列(待完善)
给你一个由小写字母组成的字符串 s ,和一个整数 k 。如果满足下述条件,则可以将字符串 t 视作是 理想字符串 :t 是字符串 s 的一个子序列。t 中每两个 相邻 字母在字母表中位次的绝对差值小于或等于 k 。返回 最长 理想字符串的长度。字符串的子序列同样是一个字符串,并且子序列还满足:可以经由其他字符串删除某些字符(也可以不删除)但不改变剩余字符的顺序得到。注意:字母表顺序不会循环。例如,‘a’ 和 ‘z’ 在字母表中位次的绝对差值是 25 ,而不是 1 。示例 1:输入:s = “acfgbd原创 2022-08-07 12:42:35 · 1504 阅读 · 0 评论 -
统计坏数对的数目
nums [j] - nums [i],这里进行变形nums[j]-j!(i原创 2022-08-07 10:19:10 · 239 阅读 · 0 评论 -
合并相似的物品
value = 1 的物品在 items1 中 weight = 1 ,在 items2 中 weight = 3 ,总重量为 1 + 3 = 4。输入:items1 = [[1,1],[3,2],[2,3]], items2 = [[2,1],[3,2],[1,3]]输入:items1 = [[1,1],[4,5],[3,8]], items2 = [[3,1],[1,5]]输入:items1 = [[1,3],[2,2]], items2 = [[7,1],[2,2],[1,4]]......原创 2022-08-07 09:38:38 · 337 阅读 · 0 评论 -
斐波那契数列
1:这道题比较简单,最难的大概就是如果不给出斐波那契具体是什么的时候自己进行编程设计会比较难,其中也涉及到了最基础的递归的思想。原创 2022-08-05 17:49:14 · 93 阅读 · 0 评论 -
字符串变形
3:学会了对带空格字符串的输入,之前输入一般都是对字符串的数组的输入,遇到空格默认就是下一个字符串,但是这里输入类型只是一个字符串就进行了学习,可以采用getline(cin,str)的方式进行输入可以遇到’\n’再停止输入~,如果是char定义的str[50].就用cin.get(str,n)n代表字符串的个数加一(这里自己有进行测试,如果写对应的个数就会少截取一个字符)5:在使用codeBlock进行调试的时候总遇到闪退的问题,这个在网上查看可能是有中文路径的问题,后期在进行实践的时候在进行更改。...原创 2022-08-05 17:34:30 · 873 阅读 · 0 评论 -
最长公共前缀
3:对于一个vector类型的数据,在使用它之前必须先对其进行赋值,并且不能直接用等于进行初始化,必须要用到特有的函数push_back()函数,之后才能像正常的数据一样直接用[i]的类型进行访问;主函数中数据输入的方法可以借鉴,假如每次输入的字符串是一行而不是以空格为分割的话可以这样写:(因为要对输入的最后一个字符串进行判断,所以必须提前知道数组的个数~给你一个大小为 n 的字符串数组 strs ,其中包含 n 个字符串,编写一个函数来查找字符串数组中的最长公共前缀,返回这个公共前缀。......原创 2022-08-05 00:24:35 · 88 阅读 · 0 评论 -
大数加法~
2:记得reverse()函数的使用,它的范围属于左开右闭区间这个要注意,以及有的时候可以巧用for循环中的i++再左右循环出去的时候会执行+1的操作。数据范围:s.length,t.length原创 2022-08-04 23:44:47 · 103 阅读 · 0 评论 -
验证IP地址
比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一个有效的地址。所以, 2001:db8:85a3:0:0:8A2E:0370:7334 也是一个有效的 IPv6 address 地址 (即,忽略 0 开头,忽略大小写)。比如, 2001:0db8:85a3::8A2E:0370:7334 是无效的 IPv6 地址。比如, 02001:0db8:85a3:0000:0000:8a2e:0370:7334 是无效的。同时,IPv4 地址内的数不会以 0 开头。...原创 2022-08-04 21:26:45 · 273 阅读 · 0 评论 -
合并两个排序的链表
1:是对链表数据结构的定义,以及初始化一个链表的时候可以自定义参数ListNode(int x):val(x),next(NULL){};对应的在创建的时候直接ListNode link1=new ListNode(0);2:二是合并的时候头节点不包含数据这一点自己最开始没有想到,使得最后输出的结果第一个总是0,后来发现了问题直接将头节点后移就解决了问题!输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。3:注意对链表的最后一个让其末尾指向NULL。.........原创 2022-08-04 20:45:28 · 113 阅读 · 0 评论