基础算法
吧啦吧啦嘭
这个作者很懒,什么都没留下…
展开
-
【算法基础】排序 插入、归并、堆、快速 升序+降序
3)如果 i=0)//最坏情况下,遍历至有序列的第一个元素。原创 2023-03-04 09:09:03 · 921 阅读 · 0 评论 -
【算法基础】归并排序
2.将mid左边和右边递归继续分,直到分到每一小部分只有一个元素;3.结合每两个小部分排序,直到所有分开的部分重新合起来。2.若升序排列,则取两部分中较小的一个,加入新数组;3.重复1,2步骤,直到有一部分被全部取完。1.取要合并的两部分首元素,比较大小;时间复杂度:O(n\log n)分:将数组分为各小部分。时间复杂度:O(n)1.计算中点mid;原创 2023-03-02 20:28:36 · 56 阅读 · 0 评论 -
【算法基础】插入排序
3.将该元素插入到有序列中的正确位置。4.依次重复3、4步,直到完成排序。时间复杂度:O(n)~O(n*n)2.取有序列后面的一个元素。1.设第一个元素为有序列。空间复杂度:O(1)原创 2023-03-02 20:23:11 · 57 阅读 · 0 评论 -
【数据结构】DFG——n皇后问题
dg[j + i] 表示 i行j列处,所在的对角线上有没有棋子,udg[n - j + i]表示 i行j列处,所在的反对角线上有没有棋子,col[j]表示第j列上有没有棋子。n− 皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。3.创建3个判断数组:col[],dg[],udg[]分别判断一行中第j个元素在列,对角线,反对角线上是否可行;2.遍历每行,对第i行中的每个元素进行判断(path[i][j]='Q'是否可行);原创 2022-11-12 16:35:13 · 131 阅读 · 0 评论 -
[数据结构]DFS——全排列
图的深度优先搜索算法:先一条路走到黑,走不下去了再返回到上一顶点,直到遍历完所有顶点。//j放在路径第u位上。3.定义函数dfs(int u)表示给第u位赋值,并改变i的状态(赋1)。4.在函数dfs(u)中,完成第u位赋值后,递归给第u+1位赋值。dfs(u + 1);if (u >= n+1)//如果位置已经占满。1.创建path[u]数组储存排列。//存已经确定的数字。void dfs(int u)//u:第u位上。输入一个正整数n,输出1~n的全排列。原创 2022-11-11 21:10:10 · 472 阅读 · 0 评论 -
快速幂 a^b a^bmod p a*bmod p
快速幂 a^b a^bmod p a*bmod p原创 2022-09-19 18:53:41 · 82 阅读 · 0 评论 -
基础算法12——离散化
离散化 应用场景:数组很大,但使用的数个数很少,即分布分散。如: //有大数组const int N=1e19;int a[N];//但是需要用到的a[]只有1e5个元素。//即 元素分布很分散。//如:当a[]只需要a[1]、a[10000]、a[100000]、a[10000000],4个数时,//这4个数分布很分散,∴可以离散化处理。 离散化处理: 将数组映射保存: a[1] ——> a[1];a[10000] ——> a[2];a[10000原创 2022-02-21 22:06:26 · 221 阅读 · 0 评论 -
基础算法11——位运算
位运算 lowbit(x):返回x的最后一位1。 eg. x=6 => x=(110)2 => lowbit(x)=10. int lowbit(int x){ return x&(-x);} &:按位与运算。-x:取x的反码,即x二进制每位取反之后+1,即-x=(~x+1)。eg.实现方式x =1010100;~x =0101011;~x+1 =0101100;x&(-x)=0000100; 例题:...原创 2022-02-21 18:25:49 · 223 阅读 · 0 评论 -
基础算法10——二维差分 求加c后的矩阵
B 二维差分Subject:输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。每个操作都要将选中的子矩阵中的每个元素的值加上 c。请你将进行完所有操作后的矩阵输出。1≤n,m≤1000,1≤q≤100000,1≤x1≤x2≤n,1≤y1≤y2≤m,−1000≤c≤1000,−1000≤矩阵内元素的值≤1000 步骤: 1.给定a[h][l]构造b[原创 2022-02-14 20:08:19 · 364 阅读 · 0 评论 -
基础算法9——一维差分
A 一维差分核心思想:前缀和逆运算。Subject:输入一个长度为 n 的整数序列。接下来输入 m 个操作,每个操作包含三个整数 l,r,c,表示将序列中 [l,r] 之间的每个数加上 c。请你输出进行完所有操作后的序列。 步骤: 1.给定a[n],构造差分数组b[n],使得a[i]=b[1]+b[2]+b[3]...b[i]。 2.核心操作:将a[l~r]都加上c,等价于公式:b[l]+=c , b[r+1]-=c。 ∵对于 1)a[1~l-1]无影响,∵b[1~l-1]没有变;原创 2022-02-14 12:43:36 · 499 阅读 · 0 评论 -
基础算法8——二维前缀和 求子矩阵的和
B 二维前缀和Subject:已知子矩阵左上角断点(x1,y1),右下角端点(x2,y2),求子矩阵中所有数的和。输入:1<n<1e4矩阵行 1<m<1e4矩阵列 1<q<2e5子矩阵询问次数 矩阵mat[] 子矩阵x1,y1,x2,y2。 步骤: 1.求s[x][y],x,y是子矩阵右下角坐标: 公式:s[x][y]=s[x-1][y]+s[x][y-1]-s[x-1][y-1]+mat[x][y]。...原创 2022-02-14 09:04:21 · 397 阅读 · 0 评论 -
基础算法7——前缀和
前缀和Subject:有数组a[n],取多组0<x<y<n,求多组a[x]~a[y]的和。 步骤:1.求s[1]=a[1],s[2]=a[1]+a[2],s[3]=a[1]+a[2]+a[3]...(下标从1开始) 2.ans=s[y]-s[x-1]。 /*输入为:1<n<1e5个整数 1<m<1e5组数 -1000<a[n]<1000整数数列 x y共m组*/#include<原创 2022-02-12 22:51:45 · 242 阅读 · 0 评论 -
基础算法6——高精度算法 加减乘除 C语言
高精度加减乘除 源码原创 2022-02-12 12:05:37 · 999 阅读 · 0 评论 -
基础算法5——二分算法 C语言
4.二分算法 本质:找有序数列中num的边界点。 步骤: A. 找右边界: 1.确定分界点 mid=(r+l+1)/2;(∵需要往右找,∴多+1) 2.比较mid和num大小; 3.更新区间:if(mid>num) [ l , num-1]; 即r=num-1; if(mid<=num) [ num , r ]; 即l=num; (∵右边界∴mid=num时往后找,∵不能漏掉mid=num的可能性,∴l=num) 4.重复1、2、3步骤,直到 l>原创 2022-02-08 22:14:17 · 521 阅读 · 0 评论 -
基础算法4——归并排序拓展:求逆序对数量
* 拓展:求逆序对数量subject:给定长度为n的数组(1≤n≤100000)(数列中的元素的取值范围 [1,1e9]),若i<j,a[i]>a[j],则为逆数对。步骤: 1)确定分点:mid=(l+r)/2; 2)数列分为[l,mid]&[mid+1,r] ∴逆序对的出现分为三种情况:a.两数在[l.mid]内; b.两数在[mid+1,r]内; c.两区间各一数。 注:两区间内数的顺序与c情况无关,∴可以单独处理完a和b情况后递归排序,方便c的处理。 3)情况a,递归算原创 2022-02-07 12:29:32 · 571 阅读 · 0 评论 -
基础算法3——归并排序 c语言
3.归并排序 主要思想:分治。 步骤: 1.确定分界点:mid=(left+right)/2; 2.分别递归排序right and left; 3.归并左右两边。 归并方法:1)两指针分别指向两数组的第一个数,数列最小值是两者其中之一; 2)取两指针所指数的最小值,作为有序数组的下一个数; 3)被取值的指针后移一位,再与另一指针所指数比较; 4)重复上述过程,直到有一数组值被取完; 5)将数组剩余的数直接连接到有序数列后。 eg.从小到大void原创 2022-02-05 14:59:01 · 1015 阅读 · 0 评论 -
基础算法2——快速排序
2.快速排序主要思想:冒泡排序的分治。步骤:1.确定分界点x,可以为:q [ left ] , q [ (left+right) / 2 ] , q [ right ] ;2.调整数组,使之成为 调整方法:1) i从left开始向右找>=x的数,得q[ i ];2) j从left开始向左找<=x的数,得q[ j ];3)如果 i<j ,说明还没有调整完成,则交换q[ i ] and q[ j ];若 i>=j 说明已经调整完。3.x左右两边递归。.原创 2022-02-04 13:12:12 · 595 阅读 · 0 评论 -
基础算法1——约瑟夫环公式
1.约瑟夫问题subject:共n人,从第k人开始从1报数,杀死报到第m个数的人,幸存者编号?formula:F(1)=0F(n)=[F(n-1)+m]%n n人需要报n-1次,即F(n)比F(n-1)多一次循环,表示为F(n-1)+m。 从F(1)=0开始推。 而%n是为了保证下标不越界。 从k开始=原序号后移k位, ∴[F(n)+k]%n eg.#include<stdio.h>int main(){ int n,k,m,...原创 2022-02-04 10:45:28 · 1549 阅读 · 0 评论