时间复杂度
-最坏时间复杂度W(n)
-平均时间复杂度A(n)
实例I \in S的概率是 PI{P_I} ,

A(n)=ISPItIA(n)=\sum_{I\in S}{P_I}*{t_I}

基础算法

暴力

-五子棋对弈,5*5的棋盘上有多少种和棋的下法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
int mp[5][5];
long long sum = 0;
void check() {
int a = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (mp[i][j] == 1) a++;
}
}
if (a != 13) return;
//此时满足13-12
int count = 0;
count += mp[0][0] + mp[1][1] + mp[2][2] + mp[3][3] + mp[4][4]; if (count % 5 == 0) return; count = 0;
count += mp[0][4] + mp[1][3] + mp[2][2] + mp[3][1] + mp[4][0]; if (count % 5 == 0) return; count = 0;
for (int i = 0; i < 5; i++) {
count += mp[i][0] + mp[i][1] + mp[i][2] + mp[i][3] + mp[i][4]; if (count % 5 == 0) return; count = 0;
count += mp[0][i] + mp[1][i] + mp[2][i] + mp[3][i] + mp[4][i]; if (count % 5 == 0) return; count = 0;
}
//满足平局
sum++;
}
void dfs(int num) {//依次由从左往右,再到从上往下的顺序遍历
if (num == 25) {//棋盘下满
check();
return;
}
int x = num / 5, y = num % 5;//换算成坐标
mp[x][y] = 0;
dfs(num + 1);
mp[x][y] = 1;
dfs(num + 1);
}
int main() {
dfs(0);//从0开始,遍历所有结果
cout << sum << endl;//3126376
return 0;
}

递归

二分

双指针

排序

分治

贪心

前缀和

差分

LCM
ST表
搜索

走迷宫

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void bfs(vector<vector<int>>& map, int rx, int ry, vector<vector<int>>& ans) {
queue<pair<int, int>> q;
q.push({ rx, ry });
vector<vector<int>> directions = { {1,0} ,{0,1}, {-1,0}, {0,-1} };
ans[rx][ry] = 0;
while (!q.empty()) {
pair<int, int> p = q.front();
int x = p.first;
int y = p.second;
q.pop();
for (auto dir : directions) {
if (x + dir[0] >= 0 && x + dir[0] < n && y + dir[1] >= 0 && y + dir[1] < m) {
if (map[x + dir[0]][y + dir[1]] == 1) {//表示有路
if (ans[x + dir[0]][y + dir[1]] > ans[x][y] + 1) {
ans[x + dir[0]][y + dir[1]] = ans[x][y] + 1;
q.push({ x + dir[0],y + dir[1]});
}
}
}
}
}
}