算法模板笔记
作者:互联网
DFS
:完全遍历,找到 符合设定条件 的所有结果
,时间复杂度高
BFS
:部分遍历,找到 最短/最小的结果
,空间复杂度高
BFS模版:
int BFS(Node start, Node target)
{
deque<Node> q;//--核心数据结构
set<Node> visited;//--避免走回头路的数据结构
q.push_back(start);/* 将起点加入deque和visited */
visited.insert(start);
int step = 0;
while(!q.empty()){/* deque非空则循环 */
int sz = q.size();
for(int i = 0; i < sz; ++i){/* 循环遍历队列节点 */
Node cur = q.front();/* 取出队列最前面的节点cur */
q.pop_front();
if(cur.val == target.val)/* 判断是否结束 */
return step;
/* 对 本层数据 自定义操作 */
/* 循环遍历cur的邻居节点,
如果没有visited过,则加入到deque和visited中*/
for(Node *nei: cur.neigh){
if(nei not in visited){
q.push_back(nei);
visited.insert(nei);
}
}
}
/* 最后次数++ */
++step;
}
}
DFS模版:
未完成?
bool backtrace(路径,选择,选择列表)
{
if(满足退出条件){
result.add(路径);
return true;
}
if(不满足路径条件){
return false;
}
当前选择,加入路径();
for(下一选择 in 选择列表){
backtrace(新的路径,下一选择,选择列表);
//--if(backtrace(路径,下一选择,选择列表))
//-- return true;
}
撤销选择,退出路径();
return false;
}
旧
bool backtrace(路径,选择列表)
{
if(满足退出条件)
result.add(路径);
return true;
if(不满足路径条件)
return false;
for(选择 in 选择列表)
做选择,加入原路径();
if( backtrace(下一递推路径,选择列表) )
return true;
撤销选择,退出原路径();
return false;
}
二分查找模版:
非查找边界的版本:
int binarySearch(int[] nums, int target) {
int left = 0;
int right = nums.length - 1; // 注意
while(left <= right) { // 注意
int mid = (right + left) / 2;
if(nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1; // 注意
else if (nums[mid] > target)
right = mid - 1; // 注意
}
return -1;
}
二叉树模版
void traverse(Node * root)
if(root == nullptr)
return;
//前序遍历
traverse(root->left);
//中序遍历
traverse(root->right);
//后序遍历
标签:遍历,return,int,路径,笔记,选择,算法,visited,模板 来源: https://www.cnblogs.com/Ping697/p/16298393.html