![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
基础算法
用C++语言讲解ACM基础算法
我终将成为你
一个大二的笨蛋大学生,喜欢看点算法 ,打算专攻机器学习。
因为有些颓废,大二上就开始实习,两段实习,中小厂AI算法边角料实习,中大厂产品经理。
感觉上班真累,重新激起学习的欲望。
展开
-
基础算法——区间合并C++
把有重合区间的多个区间合并为同一个。原创 2023-10-07 23:36:36 · 275 阅读 · 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 · 70 阅读 · 1 评论 -
基础算法——归并排序C++
归并排序中,拆解出来的小问题就是将两个有序数组变成一个有序的大数组。运用双指针算法,分别指向两个子数组的头,取较小者放在新的数组中,指针后移,直到两个指针都指向空。3.归并,将左右两个数组合二为一。这是归并排序的关键,本质上也是分治的思想。1.确定分治点 mid=(left+right)/2。2.分别对左右子数组进行递归排序。时间复杂度O(nlogn)原创 2023-09-25 11:40:17 · 80 阅读 · 1 评论 -
基础算法——离散化C++
离散化就是把大而分散的一段段使用到的稀疏区间,整合映射到连续的一段较小的稠密区间里,然后就可以通过普通前缀和公式来计算连续一段的区间和,本质上就是化大为小,把稀疏离散化简为稠密连续的一段。这一题是离散化和前缀和的结合。关键在于对函数findx映射关系的理解,下面代码中有详细注释。2.如何算出离散化后的值。1.可能有重复元素,去重。原创 2023-10-06 20:39:00 · 991 阅读 · 1 评论 -
基础算法——前缀和与差分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 · 128 阅读 · 0 评论 -
基础算法——位运算C++
原理:就是巧妙运用补码和反码的原理(x%-x=x%(~x+1))1.将这一位移到最后(右移K位)这个算法实际上是一个树形结构。作用:返回某数的最后一位。总结(n>>k%1)原创 2023-09-28 20:56:32 · 119 阅读 · 0 评论 -
基础算法——双指针算法
传统的双指针算法就是i循环里嵌套j循环,时间复杂度为O(n^2)。这种朴素算法必超时,几乎没用。双指针算法的核心就在于把朴素算法的时间复杂度优化为O(n)。原创 2023-09-27 16:19:27 · 54 阅读 · 0 评论