随笔分类 - 算法
摘要:一、中序 1. 递归 class Solution: def inorderTraversal(self, root: TreeNode) -> List[int]: if not root: return [] res = [] res.extend(self.inorderTraversal(r
阅读全文
摘要:171. Excel表列序号 每次乘26再加上当前字符序号。 for c in s: num = num * 26 num += ord(c) - ord('A') + 1 172. 阶乘后的零 对于10,只有2*5可以构成。把所有乘数能分解为2和5的都分解,显然2的数量远多于5,所以只需要乘数分解
阅读全文
摘要:131. 分割回文串 回溯。从前往后遍历所有位置 i,假如前面的 s[0: i+1] 子串是回文串,则后面的成为子问题,在字符串 s[i+1: ] 中分割回文串。 加入记忆优化,保存位置 loc 开始的所有回文串,减少重复。 还可以动态规划加快检测回文,一开始就初始化 check 数组,check[
阅读全文
摘要:算法导论中伪代码 快速排序的思想是任找一个元素作为基准(pivot),对待排数组进行分组,使基准元素左边的数据比基准数据要小,右边的数据比基准数据要大,这样基准元素就放在了正确的位置上。然后对基准元素左边和右边的组进行相同的操作,最后将数据排序完成。 这里partition相当于用快慢指针实现了把数
阅读全文
摘要:91. 解码方法 动态规划。和第70题爬楼梯差不多,dp[i] 只与前两项有关,都是每次可以走一步或两步,只是这题走一步时需要判断是否为0,走两步需要判断数字组是不是在10到26中。 (1) 若 s[i] == '0',dp[i] = dp[i-2]。因为只能由第 i-2 项走两步得到。 (2) 若
阅读全文
摘要:61. 旋转链表 所谓旋转就是把需要断开的地方断开,断开处右边为新的头结点,以及把链表尾部与head连起来。 找到断点可以 用双指针,while count < k:指针 p1 到达第 k 个结点时(之前如果 p1.next=None,就从head从头开始),p2 从头结点开始,两个指针一起遍历。直
阅读全文
摘要:31. 下一个排列 首先找到从右边起第一对升序的数对(a[i−1] < a[i]),此时a[i−1]右侧的排列是一个最大排列(因为已经是降序了)。找到a[i-1]右起第一个比它大的数a[j],将它交换位置。相当于找到右边比原a[i-1]刚好大一点的数。再翻转a[i-1]右侧的数的顺序(不包括自己),
阅读全文
摘要:1. 两数之和 把遍历过的数放在字典,数字做key,序号做value。遍历时先查字典,target减它是否为字典中key。时间复杂度O(n)。 2. 两数相加 可把比较短的链表差的位数置零补充。 3. 无重复字符的最长子串 可以字典存储滑动窗口,[i, j) 遇到重复i+1否则j+1。 4. 寻找两
阅读全文
浙公网安备 33010602011771号