BFS 算法
int BFS(Node start, Node target) {
Queue<Node> q;
Set<Node> visited;
q.offer(start);
visited.add(start);
int step = 0;
while (q not empty) {
int sz = q.size();
for (int i = 0; i < sz; i++) {
Node cur = q.poll();
if (cur is target)
return step;
for (Node x : cur.adj())
if (x not in visited) {
q.offer(x);
visited.add(x);
}
}
step++;
}
}
回溯算法
result = []
def backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
动态规划
# 初始化 base case
dp[0][0][...] = base
# 进行状态转移
for 状态1 in 状态1的所有取值:
for 状态2 in 状态2的所有取值:
for ...
dp[状态1][状态2][...] = 求最值(选择1,选择2...)
滑动窗口
void slidingWindow(string s, string t) {
unordered_map<char, int> need, window;
for (char c : t) need[c]++;
int left = 0, right = 0;
int valid = 0;
while (right < s.size()) {
char c = s[right];
right++;
...
printf("window: [%d, %d)\n", left, right);
while (window needs shrink) {
char d = s[left];
left++;
...
}
}
}