C++刷题模板笔记

C++万能头文件

#include <bits/stdc++.h>

长整型重命名

typedef long long ll;

求高精度圆周率 Pi

const double Pi = atan(1.0) * 4;

并查集

int father[1024];

int init(int n) {
	for (int i = 0; i < n; i++) {
		father[i] = i;
	}
} 

int getFather(int root) {
	int origin = root;
	
	while (father[root] != root) {
		root = father[root];
	}
	
	while (origin != root) {
		int temp = father[origin];
		father[origin] = root;
		origin = temp;
	}
	
	return root;
}

int join(int root1, int root2) {
	int a = getFather(root1);
	int b = getFather(root2);
	
	if (a != b) {
		father[a] = b;
	}
}

最长上升子序列

int LIS(vector<int> arr) {
	int res = 1;
	int dp[1010];
	
	for (int i = 0; i < arr.size(); i++) {
		dp[i] = 1;
		for (int j = 0; j < i; j++) {
			if (arr[i] > arr[j]) {
				dp[i] = (dp[i], dp[j] + 1);	
			}
			if (dp[i] > res) {
				res = dp[i];
			}
		}
		
	}
	
	return res;
}

快速幂

const int mod = 1000;

ll fast_pow(ll base, ll pow) {
	ll res = 1;

	while (pow > 0) {
		if (pow & 1 == 1) {
			res = (res * base) % mod;
		}
		
		pow >>= 1;
		base = (base * base) % mod; 
	}
	
	return res;
}

求两个数的最大公约数(辗转相除法)

int gck(int a, int b) {
	while (a % b > 0) {
		int temp = a % b;
		a = b;
		b = temp;
	}
	
	return b;
} 

求一个字符串的全排列(递归)

void perm(string str, int start) {
	if (start == str.size() - 1) {
		cout << str << endl;
		return ;
	} else {
		for (int i = start; i < str.size(); i++) {
			swap(str[i], str[start]);
			perm(str, start + 1);
			swap(str[i], str[start]);
		}
	}
}

求一个字符串的所有子串

void printAllSon(string str) {
	for (int i = 0; i < str.size(); i++) {
		for (int j = 0; j < str.size() - i; j++) {
			string son = str.substr(i, j + 1);
			cout << son << endl;
		}
	}
} 

二分查找

int binSearchOf(vector<int> &arr, int val) {
	int low = 0, high = arr.size() - 1, mid;
	bool isFind = false;
	
	while (low <= high) {
		mid = (high + low) / 2;
		
		if (arr[mid] < val) {
			low = mid + 1;
		} else if (arr[mid] > val) {
			high = mid - 1;
		} else {
			isFind = true;
			break;
		}
	}
	
	return isFind ? mid : -1;
}

判断闰年

bool isLeap(int year) {
	bool isRight = true;
	
	if (year % 4 != 0) {
		isRight = false;
	} 
	if (year % 100 == 0 && year % 400 != 0) {
		isRight = false;
	}
	
	return isRight;
}

将字符串中包含的某个字符全部替换为新字符

void updateChTo(string &str, char oldCh, char newCh) {
	int pos;
	string goal(1, newCh);
	
	pos = str.find(oldCh);
	while (pos != str.npos) {
		str.replace(pos, 1, goal);
		pos = str.find(oldCh);
	}
}

图的遍历(BFS | DFS)

void BFS(vector<vector<int> > mat, int startX, int startY) {
	int cx[] = {0, 0, -1, 1};
	int cy[] = {-1, 1, 0, 0};
	queue<pair<int, int> > q;
	
	mat[startX][startY] = 1;
	q.push({startX, startY});
	
	while (!q.empty()) {
		int x = q.front().first;
		int y = q.front().second;
		q.pop();
		
		for (int i = 0; i < 4; i++) {
			int nx = x + cx[i];
			int ny = y + cy[i];
			
			if (nx >= 0 && nx < mat.size() && ny >= 0 && ny < mat[0].size() && mat[nx][ny] != 1) {
				mat[nx][ny] = 1;
				q.push({nx, ny});
			}
		}
		
	}
}

void DFS(vector<vector<int> > mat, int x, int y, vector<vector<int> > visited) {
	int cx[] = {0, 0, -1, 1};
	int cy[] = {-1, 1, 0, 0};
	
	for (int i = 0; i < 4; i++) {
		int nx = x + cx[i];
		int ny = y + cy[i];
		
		if (nx >= 0 && nx < mat.size() && ny >= 0 && ny < mat[0].size() && visited[nx][ny] != 1) {
			visited[nx][ny] = 1;
			DFS(mat, nx, ny, visited);
		}
	}
	
}

两个字符串的最长公共子序列 — LCS(动态规划)

int LCS(string str1, string str2) {
	int row = str1.size() + 1;
	int column = str2.size() + 1;
	
	int dp[row][column];
	
	for (int i = 0; i < row; i++) {
		for (int j = 0; j < column; j++) {
			dp[i][j] = 0;
		}
	}
	
	for (int i = 1; i < row; i++) {
		for (int j = 1; j < column; j++) {
			if (str1[i - 1] == str2[j - 1]) 
				dp[i][j] = dp[i - 1][j - 1] + 1;
			else
				dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
		}
	}
	
	return dp[row - 1][column - 1];
}

持续更新。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值