Skip to content

Latest commit

 

History

History
 
 

#学习笔记

##深度优先搜索和广度优先搜索

深度优先搜索DFS代码模板

递归实现:

#Python
def dfs(node, visited())
    if node in visited: # terminator
        # already visited 
        return
       
    visited.add(node)
    
    # process current node here. 
	...
	for next_node in node.children(): 
		if next_node not in visited: 
			dfs(next_node, visited)

二叉树的情况:

void dfs(TreeNode root) {
    if (root == null) {
        return;
    }
    dfs(root.left);
    dfs(root.right);
}

或者下面这种形式:

visited = set()
def dfs(node, visited):
    visited.add(node)
    # process current node here.
    ...
    for next_node in node.children(): 
        if not next_node in visited: 
            dfs(next node, visited)

非递归实现:用一个栈来模拟递归调用

def DFS(self, tree): 
	if tree.root is None: 
		return [] 
	visited, stack = [], [tree.root]
	while stack: 
		node = stack.pop() 
		visited.add(node)
		process (node) 
		nodes = generate_related_nodes(node) 
		stack.push(nodes) 
	# other processing work 
	...

广度优先搜索BFS代码模板

代码模板:用一个队列来实现

# Python
def BFS(graph, start, end):
    visited = set()
	queue = [] 
	queue.append([start]) 
	while queue: 
		node = queue.pop() 
		visited.add(node)
		process(node) 
		nodes = generate_related_nodes(node) 
		queue.push(nodes)
	# other processing work 
	...

对二叉树的情况:

void bfs(TreeNode root) {
    Queue<TreeNode> queue = new ArrayDeque<>();
    queue.add(root);
    while (!queue.isEmpty()) {
        TreeNode node = queue.poll(); // Java 的 pop 写作 poll()
        if (node.left != null) {
            queue.add(node.left);
        }
        if (node.right != null) {
            queue.add(node.right);
        }
    }
}

BFS对于层序遍历、最短路径更加适用,可以参考 https://leetcode-cn.com/problems/binary-tree-level-order-traversal/solution/bfs-de-shi-yong-chang-jing-zong-jie-ceng-xu-bian-l/ 这篇文章的分析。

##贪心算法 思路:每一步都选择当前状态下的最优解,以希望达到全局最优解。但只有某些特殊场景下才会达到。适用场景:

  • 子问题的最优解能递推得到最终问题的最优解。这种子问题最优解被称为最优子结构。

与动态优化的区别:

  • 贪心算法:当下局部做最优判断/选择,不能回退
  • 动态规划:可以保留之前的运算结果结果,可以回退。即最优判断+回退。

##二分查找 最重要的熟练!!!

代码模板:

# Python
left, right = 0, len(array) - 1 
while left <= right: 
	  mid = (left + right) / 2 
	  if array[mid] == target: 
		    # find the target!! 
		    break or return result 
	  elif array[mid] < target: 
		    left = mid + 1 
	  else: 
		    right = mid - 1