.NET刷算法如何应用于优化?
摘要:# BFS模板-宽度优先搜索(Breadth First Search) ## 1.模板 ````C# BFS遍历 开始节点目标节点public int BFS(Node start, N
BFS模板-宽度优先搜索(Breadth First Search)
1.模板
/// <summary>
/// BFS遍历
/// </summary>
/// <param name="start">开始节点</param>
/// <param name="target">目标节点</param>
/// <returns></returns>
public int BFS(Node start, Node target)
{
//利用队列先进先出(FIFO)的特点
Queue<Node> que = new Queue<Node>();
HashSet<Node> visited = new HashSet<Node>(); //避免走回头路
int leval = 0; // 记录遍历的层数
if (start != null)
{
que.Enqueue(start); //将起点加入队列
visited.Add(start);
}
while (que.Count > 0)
{
int len = que.Count;
//当前层中的所有节点
for (int i = 0; i < len; i++)
{
Node cur = que.Dequeue();
/* 划重点:这里判断是否到达终点 */
if (cur == target)
return leval;
/* 将 cur 的下一层子节点加入队列 */
foreach (Node x in cur.childList)
{
if (!visited.Contains(x))
{
que.Enqueue(x);
visited.Add(x);
}
}
}
/* 划重点:更新步数在这里 */
leval++;
}
return leval;
}
2.推荐题目
https://leetcode.cn/problems/binary-tree-level-order-traversal/
https://leetcode.cn/problems/minimum-depth-of-binary-tree/
https://leetcode.cn/problems/open-the-lock/
回溯模板
通用模板
List<List<T>> res = new List<List<T>>();
List<T> path = new List<T>();
public void Backtracking(入参)
{
if (满足结束条件)
{
result.add(路径);
return;
}
for (选择 in 选择列表)
{
做选择
backtrack(路径, 选择列表)
撤销选择
}
}
无论是排列、组合还是子集问题,简单说无非就是让你从序列 nums 中以给定规则取若干元素
1. 元素无重不可复选
元素无重不可复选,即 nums 中的元素都是唯一的,每个元素最多只能被使用一次,这也是最基本的形式
组合、分割、子集
//问题:输入一个无重复元素的数组 nums,其中每个元素最多使用一次,请你返回 nums 的所有子集
List<List<int>> res = new List<List<int>>();
List<int> path = new List<int>();
public List<List<int>> Subsets(int[] nums)
{
BackTrac
