常用算法代码模板总结
Posted 知道什么是码怪吗?
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用算法代码模板总结相关的知识,希望对你有一定的参考价值。
以下内容只提供对应算法方便好用的模板,或者把某项功能做成函数直接传参调用。不提供详细的算法证明。持续更新中......
目录
并查集
快速排序
归并排序
KMP算法
prim算法
Kruskal算法
Dijkstra算法
Bellman-ford算法
floyd算法
二维差分以及二维前缀和
一维前缀和
public static int[] qzh(int[] nums) //传入一个一维数组,求其前缀和
int len = nums.length;
int[] result = new int[len];
result[0] = nums[0];
for (int i = 1; i < len; i++)
result[i] = result[i - 1] + nums[i];// 求一维前缀和
// for (int i = 0; i < len; i++)
// System.out.print(result[i] + " ");
//
return result;
一维差分
public static int[] cf(int[] nums) //传入一个数组,返回其差分数组
int len = nums.length;
int[] result = new int[len];
for (int i = 0; i < len - 1; i++)
result[i] += nums[i];
result[i + 1] -= nums[i];
result[len - 1] += nums[len - 1];
// for (int i = 0; i < len; i++)
// System.out.print(result[i] + " ");
return result;
去除数组中重复的元素(双指针)
public static void main(String args[])
int[] nums = 1, 1, 2, 2, 2, 3, 4, 4, 5, 6, 7 ;
int j = 0;
for (int i = 0; i < nums.length; i++) //去除数组当中重复的元素
if (i == 0 || nums[i] != nums[i - 1])
nums[j++] = nums[i];
for (int i = 0; i < j; i++)
System.out.print(nums[i] + " ");//输出:1 2 3 4 5 6 7
求最大公约数
public static int gcd(int a, int b) // 最大公约数朴素写法,传入两个数,返回最大公约数。
while (b != 0)
int temp = a % b;
a = b;
b = temp;
if (a < 0)
return -a;
return a;
public static int gcd(int a, int b) // 最大公约数递归写法
return b == 0 ? gcd(b, a % b) : a;
求最小公倍数
public static int gbs(int m, int n) // 最小公倍数,传入两个数,返回最小公倍数。
if (n > m)
int temp = m;
m = n;
n = temp;
for (int i = m;; i++)
if (i % m == 0 && i % n == 0)
return i;
求素数(欧拉筛)
public static int[] Prime(int n) // 欧拉筛求素数,传入参数n表示范围的最大值
int[] prime = new int[100010];// 能够存放的素数个数
boolean[] bool = new boolean[100010];
int count = 0;// 记录素数个数
for (int i = 2; i <= n; i++)
if (bool[i] == false)
prime[count++] = i;
bool[i] = true;
for (int j = 0; j < count; j++)
if (i * prime[j] > n)
break;
bool[i * prime[j]] = true;
if (i % prime[j] == 0)
break;
System.out.printf("0~%d范围内的素数个数为:%d\\n", n, count);// 输出个数
return prime;
判断一个图是否连通
public static boolean Warshall(int[][] tmp, int n) // 传入这个图的邻接矩阵和节点个数。判断图是否连通,连通返回true
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (tmp[i][j] == 1)
for (int k = 0; k < n; k++)
if (tmp[k][i] == 1)
tmp[k][j] = tmp[j][k] = 1;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (tmp[i][j] != 1)
return false;
return true;
高精度加法(C++)
java和python用不上高精度。java用BigInteger,python更方便。
vector<int> add(string a, string b)//传入两个数的字符串形式,返回之和。
if (a.length() < b.length()) return add(b, a);
int t = 0;
vector<int> A, B, c;
for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');
for (int i = 0; i < A.size(); i ++ )
t += A[i];
if (i < B.size()) t += B[i];
C.push_back(t % 10);
t /= 10;
if (t) C.push_back(t);
for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
return C;
高精度减法(C++)
高精度减法存在正负号的判断,稍微复杂一点。
bool cmp(vector<int> &A, vector<int> &B)//正负号判断
if (A.size() != B.size()) return A.size() > B.size();
for (int i = A.size() - 1; i >= 0; i -- )
if (A[i] != B[i])
return A[i] > B[i];
return true;
vector<int> sub(vector<int> &A, vector<int> &B)//传入数字,返回差。
vector<int> C;
for (int i = 0, t = 0; i < A.size(); i ++ )
t = A[i] - t;
if (i < B.size()) t -= B[i];
C.push_back((t + 10) % 10);
if (t < 0) t = 1;
else t = 0;
while (C.size() > 1 && C.back() == 0) C.pop_back();
return C;
int main()
string a, b;
vector<int> A, B;
cin >> a >> b;//输入两个字符串形式的数组,返回其差
for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
for (int i = b.size() - 1; i >= 0; i -- ) B.push_back(b[i] - '0');
vector<int> C;
if (cmp(A, B)) C = sub(A, B);//根据正负号的不同选择不同的相减方式
else C = sub(B, A), cout << '-';
for (int i = C.size() - 1; i >= 0; i -- ) cout << C[i];
cout << endl;
return 0;
高精度乘法(C++)
高精度乘法的两个数一般只有1个数非常大。
vector<int> mul(string a, long b)//传入一个数的字符串形式和另一个数,返回其乘积。
vector<int> A, c;
int t = 0;
for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
for (int i = 0; i < A.size() || t; i ++ )
if (i < A.size()) t += A[i] * b;
C.push_back(t % 10);
t /= 10;
while (C.size() > 1 && C.back() == 0) C.pop_back();
//for (int i = C.size() - 1; i >= 0; i -- ) printf("%d", C[i]);
return C;
高精度除法(C++)
vector<int> div(string a, int b, int &r)//传入
vector<int> A, c;
r = 0;//记录余数
for (int i = a.size() - 1; i >= 0; i -- ) A.push_back(a[i] - '0');
for (int i = A.size() - 1; i >= 0; i -- )
r = r * 10 + A[i];
C.push_back(r / b);
r %= b;
reverse(C.begin(), C.end());
while (C.size() > 1 && C.back() == 0) C.pop_back();
printf("\\n余数为:%d\\n",r);
return C;
以上是关于常用算法代码模板总结的主要内容,如果未能解决你的问题,请参考以下文章