有限状态自动机 初始状态、接受状态、状态集合、转移规则 自动机驱动的编程 暴力枚举的延伸 KMP算法 记录 leetcode剑指offer第20题表示数
正则匹配 动态规划问题 python |= 记录 leetcode剑指offer第49题正则表达式匹配 class Solution: def isMatch(self, s: str, p: str) -> bool: m = len(s) n = len(p) ans = [[False] * (n + 1) for _ in range(m+1)] for i in
n & (n - 1) 字符串全排列
快速幂 ** / pow() O(log n) 浮点取幂 math.pow() O(1) 大数求余 循环取余O(n)、快速幂求余O(log n) res = 1 while n: if n % 2: res = (res * base) % p base = base ** 2 % p n //= 2 剪绳子(数学
各位数之和 def digitsum(n): ans = 0 while n: ans += n % 10 n //= 10 return ans 递推 保存中间值,不分大小问题 记录 leetcode剑指offer第13题机器人的运动范围 class Solution: def movingCount(self, m:
比O(n)更快的就是O(log n) 当O(n)是显而易见的答案时,就要思考二分查找来更快。 pivot中心点 第一次计算可放在循环中 二分防溢出 low + (high
用两个栈可实现队列插入、删除均为O(1)的时间复杂度 class CQueue: def __init__(self): self.stack1 = [] self.stack2 = [] def appendTail(self, value: int) -> None: self.stack1.append(value) def deleteHead(self) -> int: if not self.stack2: while self.stack1: self.stack2.append(self.stack1.pop()) if not self.stack2: return -1 return self.stack2.pop() 斐波那契数列的标准简
递归建树 leetcode剑指offer第7题重建二叉树 前序遍历用于确定根节点,中序遍历用于划分左右子树 class Solution: def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: self.preorder = preorder self.tmp = {inorder[i]: i for i
非线性遍历 树的遍历:对节点访问次序的不同 书的目录:前序遍历 def preorder(tree): if tree: print(tree.getRootVal()) preorder(tree.getLeftChild()) preorder(tree.getRightChild()) 表达式求值:后序遍历 生成中缀表达式:前序遍历
数学方法 找规律,结果由输入数据决定。 足够聪明 知道了所有情况,不可能是贪心,可能是动态规划或数学方法。