自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 动态规划——背包问题_01背包问题(C++)

问题如下:有N件物品,每件物品有不同的价值和所需容量,有一个容量为V的书包,选择合适的物品,使背包中物品价值最大。1.选择第i件物品 f[i][j]=f[i-1][ j-v[i] ] +w[i]背包问题是动态规划问题中的经典问题,01背包问题是动态规划的最基础入门问题。f[i][j]代表只考虑前i个物品,背包容量使用量为j的情况下的最大价值。2.不选择第i件物品 f[i][j]=f[i-1][j]唯一合法的初始化操作是f[0][0]=0;f[i][j]为以上两种情况的最大值。

2024-02-16 22:26:50 451 1

原创 数论——欧拉函数C++

求一个数的欧拉函数,就是在求该数只因数的基础上引入欧拉公式。欧拉公式是用来求整数1到n中与n互质的数的个数。

2024-01-30 14:36:05 550 1

原创 数论——约数(辗转相除法)C++

这是求最大公约数的常用方法,整数a和b求最大公约数,c为a除以b的余数(c!=0),整体思想就是gcd(a,b)=gcd(b,r),有递归和非递归两种写法,都很简单。利用循环,一个个试,直到sqrt(n);

2024-01-11 10:35:38 463

原创 数论————质数C++

1.大于12.从2到n-1没有约数。

2023-11-08 23:21:17 205 3

原创 数据结构——哈希表C++

哈希表一个重要的点是处理冲突,冲突就是一个数经过哈希函数处理后得到的结果,已经被其他数得到过,那哈希表该位置上就已经存在数据了,这就引起了冲突。关键就在于一个find函数,如果找到了,返回该数的位置,如果没找到,返回该数应该放的位置。如遇冲突,将数据也放在该位置上,排在已有数据后面,像拉链一样。这个方法比简单,就是你若这个位置上有数了,就继续往后找。把一些范围很大的数,通过哈希函数,映射成小范围的数。哈希表按照两种不同的处理冲突的方法,分为两类。(以下列举两种处理冲突的方式)

2023-11-03 22:57:57 203 2

原创 数据结构——堆排序C++

堆实质上是一个完全二叉树,将根结点最大的堆叫做大顶堆,根结点最小的堆叫做小顶堆。堆是一个线性结构,相当于一个数组,每个结点都有两个后继。以大顶堆为例,每个结点都大于其左右两个子树的任意结点,依次类推。假设堆用数组heap[ ]模拟。用一个一维数组来模拟堆,对于x结点,左儿子是2x,右儿子是2x+1。在细讲手写堆的操作之前,先声明一点:堆的作用就是维护堆顶,即找出一组数的最大值或最小值。对于堆中元素的位置,只有两个操作,up和down。

2023-10-26 19:26:00 186 1

原创 数据结构——并查集C++

基本原理:每个集合用一棵树来表示,树根的编号就是整个集合的编号,每个节点储存他的父节点,p[x]表示x的父节点。这是一道最简单的并查集题目,没有附加存储信息,关键就在于每个结点的祖宗结点,只需要注意这一个信息就可以了!如何求集合编号:while(p[x]!=x)x=p[x];如何合并两个集合:把一个根节点接到另一个上。2.询问两个元素是否在一个集合当中。如何判断树根 p[x]==x;

2023-10-18 22:30:20 119 1

原创 数据结构——Tire树(字典树)

高效存储和查找字符串字符串集合的数据结构这是一种树形数据结构,用空间换时间,利用字符串相同的前缀降低算法复杂度。常用的操作有插入和查询。下图展示了字典树结构和建立方法:创建一颗Tire树的方法就是,从树根开始查找,如果没有当前字符,创建一个子结点,如果有,继续向下查找,依次向下。

2023-10-16 15:50:58 161 2

原创 数据结构——KMP C++

算法的核心就在于,利用已经匹配好的某段字符串,寻找这段字符中的相等的前缀和后缀,然后一次性获得最小的移动,使移动完还匹配地上,巧妙!我的阐述不是很清晰,下面以KMP板子题为例,进一步分析。KMP算法全称是Knuth-Morris-Pratt 算法,是Knuth,Morris,Pratt这三个人一起研究出来的字符串匹配算法,通过已经匹配过的字符来降低时间复杂度。

2023-10-14 00:46:47 106 1

原创 数据结构——单调队列C++

与单调栈几乎一样,原理也一模一样,唯一的不同就是队头元素可以出去,适配于滑动窗口。

2023-10-12 22:59:57 113

原创 数据结构——单调栈C++

单调栈的最典型应用是在一个数组中,找到离该数最近的,较大或较小的数。单调栈实际上底层逻辑是一个双指针算法,是对暴力双循环的简化。以板子题为例:如有数组 3 4 2 6 7 1输出在各数左边比他小的数,如果没有,输出-1。暴力做法显而易见是运用双重循环,运用双指针算法,j指针一直往后移,指向当前要处理的数,i指针要指向符合题目条件的数(单纯用指针模拟较难得到结果,所以用栈这种数据结构的栈顶来代替i指针)

2023-10-12 00:14:50 171

原创 数据结构—链表(数组模拟链表)C++

传统的链表往往用含有指针的结构体构造,每一次增加一个数据项都要进行一次new操作,效率很低,用数组模拟链表大大提高了算法的效率。单链表最大的用途是用来写邻接表,邻接表主要用来存储图和树。双链表多用于优化单链表。

2023-10-10 13:54:06 160 1

原创 基础算法——区间合并C++

把有重合区间的多个区间合并为同一个。

2023-10-07 23:36:36 265 1

原创 基础算法——离散化C++

离散化就是把大而分散的一段段使用到的稀疏区间,整合映射到连续的一段较小的稠密区间里,然后就可以通过普通前缀和公式来计算连续一段的区间和,本质上就是化大为小,把稀疏离散化简为稠密连续的一段。这一题是离散化和前缀和的结合。关键在于对函数findx映射关系的理解,下面代码中有详细注释。2.如何算出离散化后的值。1.可能有重复元素,去重。

2023-10-06 20:39:00 909 1

原创 基础算法——位运算C++

原理:就是巧妙运用补码和反码的原理(x%-x=x%(~x+1))1.将这一位移到最后(右移K位)这个算法实际上是一个树形结构。作用:返回某数的最后一位。总结(n>>k%1)

2023-09-28 20:56:32 109

原创 基础算法——双指针算法

传统的双指针算法就是i循环里嵌套j循环,时间复杂度为O(n^2)。这种朴素算法必超时,几乎没用。双指针算法的核心就在于把朴素算法的时间复杂度优化为O(n)。

2023-09-27 16:19:27 45

原创 基础算法——前缀和与差分C++

差分矩阵实际上就是前缀和矩阵的逆运算,再运用差分运算,用处理四个点代替四个矩阵,由于代码太简单了,懒得贴了,over【略略略。差分可以理解为只有这一个操作,可以假定a数组原始都为0,每一个a[i]都是b[i]+a[i],b[i+1]-a[i]操作。应用:例如让a数组的[l,r]区间都加c,只需要b[l]+c,b[r+1]-c即可,降低时间复杂度。给出一个二维数组a,首先建立前缀和矩阵S,S[i][j]代表a数组前i行j列的和。差分实质上是前缀和的逆运算,若a数组是b数组的前缀和,b就是a的差分。

2023-09-26 23:30:52 121

原创 基础算法——归并排序C++

归并排序中,拆解出来的小问题就是将两个有序数组变成一个有序的大数组。运用双指针算法,分别指向两个子数组的头,取较小者放在新的数组中,指针后移,直到两个指针都指向空。3.归并,将左右两个数组合二为一。这是归并排序的关键,本质上也是分治的思想。1.确定分治点 mid=(left+right)/2。2.分别对左右子数组进行递归排序。时间复杂度O(nlogn)

2023-09-25 11:40:17 74 1

原创 算法基础——快速排序C++

利用两个下标i,j模拟指针,i初始化为0,指向数组中第一个元素,j指向最后一个,若i指向的元素小于分治点,i++,若j指向的元素大于分治点j--,交换两指针指向的数,重复以上过程直到i>=j。注意:此处的left和right指的是分治的一段数组左右端点,i和j是在该数组片段中的移动指针,一定要明确区分,不要混淆。快速排序基于分治的思想,即把一个大问题拆解为小问题进行递归。2、把比分治点小的放在分治点左边,比分治点大的放在分治点右边。1、确定分治点,可以是首个元素,中间位置元素或者随机元素。

2023-09-24 22:21:36 66 1

空空如也

空空如也

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

TA关注的人

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