常用算法代码模板总结

Posted 知道什么是码怪吗?

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了常用算法代码模板总结相关的知识,希望对你有一定的参考价值。

以下内容只提供对应算法方便好用的模板,或者把某项功能做成函数直接传参调用。不提供详细的算法证明。持续更新中......

目录

并查集

快速排序

归并排序

KMP算法

prim算法

Kruskal算法

Dijkstra算法

Bellman-ford算法

floyd算法

二维差分以及二维前缀和

一维前缀和

一维差分

去除数组中重复的元素(双指针)

求最大公约数

求最小公倍数

求素数(欧拉筛)

高精度加法(C++)

高精度减法(C++)

高精度乘法(C++)

高精度除法(C++)


并查集

并查集java代码模板

快速排序

快速排序java代码模板

归并排序

归并排序java代码模板

KMP算法

图解KMP算法原理及其代码分析

prim算法

最小生成树之prim算法java代码模板

Kruskal算法

最小生成树之Kruskal算法java代码模板

Dijkstra算法

单源最短路之Dijkstra算法java代码模板

Bellman-ford算法

单源最短路之Bellman-ford算法java代码模板

floyd算法

多源最短路之floyd算法java代码模板

 二维差分以及二维前缀和

前缀和与差分java代码模板

一维前缀和

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;


 

以上是关于常用算法代码模板总结的主要内容,如果未能解决你的问题,请参考以下文章

最短路问题常用算法总结和模板

算法基础:单链表图解及模板总结

算法基础| 二分图解及代码模板

STL-常用算法总结

数论总结 (常用定理+ 模板)

常用算法总结