算法方法
介绍常见的算法解体技巧
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))
努力拼搏吧,不要害怕,不要去规划,不要迷茫。但你一定要在路上一直的走下去,尽管可能停滞不前,但也要走。