算法种类介绍
自顶向下编程范式
关键是要先解决最上层的主干逻辑
1.首先思考主干逻辑,不要纠结于具体细节
2.主干逻辑编写好后再一步一步实现主干逻辑的子函数
cpu能执行的指令类型
if else 条件判断指令
for while recursion函数递归 循环执行指令
所有的程序都是基于以上两种类型的指令来实现的
算法的本质(所有问题的解决思路)就是不断的找重复性
指针移动法
双指针对向移动法
一个指针变量指向数组的开始位置 ,一个指针指向数组的结束位置,两个指针分别向对方移动
双指针同向移动法
两个指针变量,一个指针变量指向0的位置循环到数组长度-1的位置。一个指针变量指向前面变量的位置+1,循环到数组长度的位置
# 两层循环枚举不同的下标元素 for i in range(len(nums)-1): #0,1,2 for j in range(i+1,len(nums)): #1,2,3 if nums[i] + nums[j] == target: res[0]=i res[1]=j print(res)
快慢指针法
两个指针变量都指向链表的起始位置,但是一个指针跨度为1,一个指针跨度为2,同时向前移动.如果这个是个环形链表结构,那么快指针一定可以在某个位置和慢指针重合
循环迭代法
for循环 while循环
循环迭代法一般用于遍历处理一维的数据结构 比如:数组 链表 栈 队列 集合 映射等数据结构
数学归纳法
从小到大进行处理 总结它们之间的规律
比如求n的斐波拉契数列 可以先求n=1的结果 再看n=2的结果 依次增加n的值 总结其中的规律
比如爬楼梯问题当需要求到n阶台阶情况的时候 可以先看n=1然后n=2的情况 最后归纳出n变化时候它们之间的规律是怎么样的 这样就可求出n的结果
剪枝法
在递归函数业务逻辑中使用条件判断排除掉不符合条件的数据
递归调用法
递归就是一个函数在内部调用自己,只不过调用函数自己的时候传入的参数的值是不一样的.每个递归处理都对应着一个对应的递归状态树
递归一般用于处理二维的数据结构 比如:树 图 二叉搜索树 并查集
递归代码实现步骤:
1.设置递归调用终止条件 避免出现无限递归调用
2.处理当前层次调用的业务逻辑
3.调用函数自身传递不同的函数参数(下探到下一个层次的调用)
4.清理当前层的状态(可以没有)

搜索法
处理二维数据结构:树和图
普通的树和图 需要遍历所有的节点,每个节点都需要访问一次而且只能访问一次
包含深度优先搜索和广度优先搜索两种方式
二分查找法
使用二分查找的时候对查找的数据结构有几个要求:
1.所有的数据必须先按升序或者降序排列好
2.每个元素必须可以按照索引进行访问
实现步骤:
1.对数组进行排序
2.定义左右两个指针 左指针指向开始 右指针指向结尾
3.循环判断 左指针向右指针移动 右指针向左指针移动.当左指针等于右指针时候退出循环
4.定义一个中间指针它的值是(当前左右指针的和/2)
5.判断中间指针的值和需要查找的值的大小
1.查找的值大于中间指针的值就要设置左指针为中间指针位置
2.查找的值小于中间指针的值就要设置右指针为中间指针位置
3.查找的值等于中间指针位置的值就代表找到
left,right=0,len(nums)-1 //定义左右指针 while left <= right: mid = (left+right)/2 //根据左右指针算出中间指针位置 if nums[mid] == target: return mid elif nums[mid] > target: right = right -1 else: left=left+1
贪心查找法
贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法
贪心算法和动态规划的不同在于它对每个子问题的解决方案做出选择,不能回退.动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能.
当下做出局部最优判断+不能回退

动态规划法


本文来自博客园,作者:不懂123,转载请注明原文链接:https://www.cnblogs.com/yxh168/articles/12559747.html
浙公网安备 33010602011771号