算法方法

介绍常见的算法解体技巧

1.滑动窗口
2.递归
3.分治法(建立在递归上)
4.回溯法(建立在递归上)
5.动态规划(最难)
6.BFS/DFS(宽度优先搜索,深度优先搜索):可结合二叉树的构成学习
7.前缀树(字典树)

滑动窗口

减少while循环
查看相同的部分:数组中的定长问题
LC:209:不知道加几个元素直接用while
LC:1459:

递归

递归的操作可以在递归拆解之前,也可以在递归拆解之后(一般在递归之后),
如反转链表

if not head or not head.next:# 终止的条件
    return head
# head.next;遍历下一个节点
p = self.reverseList(head.next) # 进入下一层递归
# 上方是递归拆解,下方是递归的操作
# head的下一个指针head.next;下一个指针指向head
head.next.next = head
# head的下一个指针指向None
head.next = None
return p # (16 ms)

例外:斐波那契数列(递归拆解和操作可以写在一起)

if n<2: # 递归重点小于2
    return 0 if n==0 else 1
m = self.fib(n-1) + self.fib(n-2)
return m

分治法

把大问题拆解成小问题,然后求解,再把求到的解合并起来。

例如归并排序

学习的是如何进行分:递归处理元素,元素要进行排序比较
LC169:多数元素(拆解元素的left,mid)left是并没有改变的,它是如何拆解元素进行递归的
LC53:最大子数组和 : 分治拆解每次最层的最大子序列和,然后最终组合。(不理解左边最大值,右边最大值。)

回溯法

一层一层向下递归,尝试搜索答案。
LC78:子集
LC:22括号生成

动态规划

1.计数:有多少种方法,机器人从左上角到右下角有多少种方法
2.求最值:最大值/最小值
3.求存在性:是否存在某个解
LC:62不同路径

解题方法

一般解题都需要借助数组
1.初始状态
2.方程式 :格子路径和 = 格子上方 + 格子左方
3.终止状态

前缀树(字典树)

把相同的前缀先排在类似于树结构的前缀树中。找到匹配的前缀即返回
LC208 实现trie
用前缀树解决的问题一般都有个实现前缀树的类(类似的还有二叉树(创建树节点),链表(创建链表头节点,指定尾节点为None))

posted @ 2022-03-22 16:30  索匣  阅读(52)  评论(0编辑  收藏  举报