
c++算法刷题
文章平均质量分 97
算法相关
遨游的laugh哥
CS
展开
-
排序题+贪心
则:枚举1~nums[index]的所有可能,然后选择到达位置后,下一个位置的最远距离。这种情况是,遍历到下一个孩子之前,需要不断放弃尺寸小饼干,直至找到满足当前孩子胃口饼干后,接着遍历。把孩子和饼干按照升序排序,然后遍历孩子,如果孩子胃口值<=当前大饼干,就把饼干分配给他。不然的话,:也就是饼干小于胃口,放弃当前孩子,寻找下一个更小的孩子。遍历一次左一半数组,每次第一个不满足的j值,之前就是符合要求的。这样天然的满足i<j的条件,因为i在左一半数组,j在右一半数组。原创 2024-06-10 13:36:57 · 832 阅读 · 1 评论 -
二分判定+选插冒排序+归并快速堆希尔+计数排序
思路:首先对数组原地调整成大顶堆。原创 2024-05-13 03:05:33 · 659 阅读 · 0 评论 -
BST+二分
第一个等于【1,4,4】等于的时候也要缩小r,如果r恰好在等于前一个位置时说明找到了,此时l==r然后运行一次,把l值+1即可int l = 0;//闭区间:[l,...,r]//等于时候也要缩小r才能找到第一个等于}else{//l值对应正确的结果return l;最后一个等于思路类似,只是要不断扩大l,使得l指向第一个大于目标值的位置int l = 0;原创 2024-04-22 01:37:56 · 1011 阅读 · 0 评论 -
记忆化搜索+堆+优先队列
结构上要求:必须是完全二叉树父节点大于等于孩子结点或父节点小于等于孩子结点堆有大顶堆和小顶堆两种类型也可以叫:大根堆,小根堆只有父子结点有数值上的关系,兄弟间大小无要求堆也可以用其他数据结构实现,用二叉树实现堆的性质的堆叫二叉堆二叉堆的本质----满足父子数值关系的一种完全二叉树堆:从根到叶子的一条路径满足单调性是包含在头文件中基本操作:top()访问对头元素empty()队列是否为空size()返回队列内元素个数push()插入元素到队尾,并排序emplace()原创 2024-04-12 02:52:13 · 627 阅读 · 0 评论 -
回溯dfs和分支限界bfs
所以递归参数需要数字i,表示当前访问的第i个数字。用map记录字符串,第一次出现的就是最小的,用map存储后,后续不同位置变化出的相同字符串的层数不会更新。这里要从边界出发,从四周的O出发,把所有相连的O找到做好标记,这些O是不能被替换成X的。,那么对于每个点进行上下左右遍历,只要值大于它,也就是满足了单调递增的条件,就指向它。每一次都从图中删除没有前驱的顶点,这里并不需要真正的删除操作,通过设置入度数组。每一轮都输出入度为 0的结点,并移除它,同时修改它指向的结点的入度(−1-即可)原创 2024-03-30 02:33:50 · 1120 阅读 · 0 评论 -
图和树的路径问题
这里需要存储三个元素:节点,路径和余下值,由于pair是二元组,存储三个元素要么pair复合使用,要么使用tuple。0—>10->15->18->16----找和为1,看sum-target在mp中是否存在。本题就是,每次增加一条边,然后对图进行遍历,当新加入的边使得图成环,则该边为所求。这里:起点不同,但是必须是在自己的子树下面查找,也就是更换根,然后借助函数去找路径。0—>10->15->18->21----21-10就是:5->3->3。下图:绿色是父节点,红色是当前结点,紫色背景代表结点以访问。原创 2024-03-22 22:51:36 · 1091 阅读 · 0 评论 -
分治算法和树
解法一:利用map记录二叉树的所有结点的父节点(该题无重复元素),然后把其中一个结点的路径用set记录下来,那么遍历另一个节点时,只要相遇(就是该节点第一次遍历到上一个结点走过的,也就是set记录过),则该点就是所求点。区别就在于判断的是当前结点的孩子结点是否为x,避免NULL->val,需要先判断存在。:递归或迭代地将原问题分解为各个的子问题(性质相同的、相互独立的子问题)比如对于5:5的父节点是9,9的父节点是7,组成路径:597。子问题之间是没有重叠的,互相没有依赖,可以被独立解决。原创 2024-03-15 02:22:27 · 962 阅读 · 0 评论 -
递归与回溯2
比如{1,2,3}中{1,3}和{3,1}是重复的,所以元素只能以该元素为起点,向后递归,不能往前选。但是组合规定了个数,只要在结果处存储正确的符合条件的结果即可,在所有路径提前剪去不符合要求的。这里是传入新变量,当然也可以用ans,但是需要pop_back(),防止影响结果。也就是变动原数组,选择一个就把自己的选择去掉,然后递归,回溯的时候补上元素。是隐式递归结束变量,也可以单独用一个参数,但是要注意。当然也可以用减法实现,size==0一样可以结束递归。分为排列,子集,组合,后一种分别是前一种的子集。原创 2024-03-02 20:07:30 · 998 阅读 · 0 评论 -
递归与回溯(一)
发现迭代写法的特点,每次for的时候都会放入当前下标的值nums[下标],然后for结束前,也就是内层循环回退到外层循环时,都需要pop也就是放弃已选的元素。则n=2的可能:{1,1},{1,2},{1,3},{2,1},{2,2},{2,3},{3,1},{3,2},{3,3}如何放弃重复的元素不选,也就是直接跳过这次结果,方法:设置标记,如果标记后,for不执行本次结果。[1,2,3] 的子集可以由 [1,2] 追加得出,[1,2] 的子集可以由 [1] 追加得出。原创 2024-02-26 21:50:31 · 886 阅读 · 0 评论 -
哈希+set+map
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度映射函数叫做散列函数存放记录的数组叫做散列表一般选用模N取余来获得要插入的位置对不同的关键字可能得到同一散列地址,即k1≠k2,而,这种现象称为冲突一般有拉链发和开放定址法来处理冲突//map按key降序,set降序排列//key可以重复mp[val]++;//输出集合set//输出映射map。原创 2024-02-20 02:06:05 · 1077 阅读 · 0 评论 -
双端队列,优先队列,单调队列
队列原创 2024-02-15 16:39:02 · 1013 阅读 · 0 评论 -
双指针和单调栈
sort()第三个参数可以自己自定义,注意函数要用bool返回值,而且传参时不要加()int age;//按姓名升序//按年龄降序//迭代器初始化数组指针初始化stu + 1stu + 4参数的函数无括号sort(vec.end()cmp_age。原创 2024-02-09 02:47:03 · 880 阅读 · 0 评论 -
前缀和与差分
给定一个数组nums,其差分数组diff就是第一个元素不变,其余:diff[i]=nums[i]-nums[i-1] ( i>=1)为了不用分类讨论,一般设置前缀和数组第一个元素为0,这样:nums[0]=pre[0+1]-pre[0]可得到。发现对原数组需要进行[l,r]的操作,但是在差分数组只需要对l和r+1位置做出改变,这样在效率上会提高。设S[i,j]是(0,0)位置到(i,j)位置的和,a[i,j]是(i,j)位置上的值。注意:[i,j]之间的和:包含j且j最大的和-不包含i且i-1最大的和。原创 2024-02-04 17:42:06 · 968 阅读 · 0 评论