【数据结构与算法之美】常见算法的模板

1.递归

1.1 代码实现

	public void recur(int level,int param){
		//terminator  --》终止条件
		if(level > MAX_LEVEL){
			//process result
			return;
		}

		//process current logic  --》 当前逻辑处理
		process(level,param);
		
		//drill down           --》 递归到下一个子问题。
		recur(level:level+1,newParam);
		
		//restore current status  --》存储当前状态 -非必须。
 	}

1.2 思维要点

1.不要人肉递归(最大误区)
2.找到最近最简方法,将其拆成可重复解决的问题(重复子问题)3.数学归纳法整理

2.回溯法

2.1 代码实现

result = []
def backtrack(路径, 选择列表):
    if 满足结束条件:
        result.add(路径)
        return

    for 选择 in 选择列表:
        做选择
        backtrack(路径, 选择列表)
        撤销选择

2.2 思维要点

回溯法主要是通过递归来实现的。
1.找到一个可能存在的正确的答案。
2.在尝试了所有可能的分步方法后宣告该问题没有答案。
ps:在最坏的情况下,回溯法会导致一个复杂度为指数时间的计算。

3.二分查找

3.1 代码实现

	left , right = 0,len = array.length-1;
	while(left <= right){
		mid = (left + right) / 2;
		if(array[mid] == target)
			return result;
		else if(array[mid] < target)
			left = mid + 1;
		else 
			right = mid-1;
	}

3.2 思维要点

二分查找的前提
1.目标函数单调性(单调递增或递减)
2.存在上下界(bounded)
3.能够通过索引进行访问(index accessible)

4.分治

4.1 代码实现

在这里插入图片描述

4.2 思维要点

分而治之的思想。将一个大的问题分解成多个重复的子问题。先解决每个子问题,在将子问题求解。而递归只是实现分子的一种手段而已、
原文地址:https://www.cnblogs.com/qxlxi/p/12860577.html