随笔分类 - 算法
摘要:python 装饰器 描述 python 中一切皆对象,函数也可以当作参数传递 装饰器就是接受一个函数作为参数,添加功能后返回一个新函数的函数或类。 python 中使用 @ 来使用装饰器。(@ 只是装饰器的语法糖,可以等价替代为其他) 装饰器经常用到的功能就是在代码中添加 log 日志。 实例 下
阅读全文
摘要:leecode刷题(31) 回文数 回文数 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 示例 2: 示例 3: 进阶: 你能不将整数转为字符串来解决这个问题吗? 思路 关于字符串的题目, 双端遍历法 可以解决很多问题。这里虽然是整数,但是我们
阅读全文
摘要:TOPK 问题 描述 如从海量数字中寻找最大的 k 个,这类问题我们称为 TOPK 问题,通常使用堆来解决: 求前 k 大,用最小堆 求前 k 小,用最大堆 例子 现有列表 , 求前 2 个大的元素。 如传入列表和 k = 2,输出 。 思路 1. 先放入元素前 k 个建立一个最小堆 2. 迭代剩余
阅读全文
摘要:leecode刷题(30) 二叉树的后序遍历 二叉树的后序遍历 给定一个二叉树,返回它的 后序 遍历。 示例: 思路 跟上道题一样,我们使用递归的思想解决。 后序遍历: 先处理左子树,然后是右子树,最后是根 代码如下 Java 描述 python 描述 总结 对比如下:
阅读全文
摘要:leecode刷题(29) 二叉树的中序遍历 二叉树的中序遍历 给定一个二叉树,返回它的 中序 遍历。 示例: 思路 跟上一道题一样,用递归的思想很快就能解决。 中序遍历: 先处理左子树,然后是根,最后是右子树。 代码如下 Java 描述 python 描述 总结 对比如下:
阅读全文
摘要:leecode刷题(28) 二叉树的前序遍历 二叉树的前序遍历 给定一个二叉树,返回它的 前序 遍历。 示例: 思路 这道题我们用递归的思想很容易就能解出来。前序遍历,我们先处理根,之后是左子树,然后是右子树。 代码如下 Java 描述 python 描述 总结 两门语言的代码量差不多,用递归几行就
阅读全文
摘要:leecode刷题(27) 合并k个排序链表 合并k个排序链表 合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。 示例: 思路 以前做过合并两个有序链表的问题,所以刚开始想到的解法与之类似,我们可以先合并两个有序链表,再用合并的新链表去合并第三个链表: 其实如果我们学习过堆相关
阅读全文
摘要:leecode刷题(26) 用栈实现队列 用栈实现队列 使用栈实现队列的下列操作: push(x) 将一个元素放入队列的尾部。 pop() 从队列首部移除元素。 peek() 返回队列首部的元素。 empty() 返回队列是否为空。 示例: 说明: 你只能使用标准的栈操作 也就是只有 , , , 和
阅读全文
摘要:leecode刷题(23) 合并两个有序链表 合并两个有序链表 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 思路: 这道题我们可以用递归的方法来处理。首先我们可以设置一个临时头节点 head,当链表 l1 和链表 l2 不为空时,对它们进行比
阅读全文
摘要:leecode刷题(24) 翻转二叉树 翻转二叉树 翻转一棵二叉树。 示例: 输入: 输出: 备注: 这个问题是受到 "Max Howell " 的 "原问题" 启发的 : 谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。
阅读全文
摘要:leecode刷题(22) 反转数组 反转数组 反转一个单链表。 示例: 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 思路: 很明显,链表问题我们要通过改变指针指向来解决问题: 首先定义 , , 三个指针: 让 : 再让 , , : 重复上述操作直到 : 最后让 即可: pre
阅读全文
摘要:leecode刷题(21) 删除链表的倒数第N个节点 删除链表的倒数第N个节点 描述: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 说明: 给定的 n 保证是有效的。 思路: 这道题我们可以采用双指针法来解答。定义两个指针 left 和 right, 都让其指向链表的
阅读全文
摘要:leecode刷题(20) 删除链表中的节点 删除链表中的节点 描述: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。 现有一个链表 head = [4,5,1,9],它可以表示为: 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定
阅读全文
摘要:leecode刷题(19) 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 。 示例 1: 示例 2: 说明: 所有输入只包含小写字母 。 思路: 这道题我用的是暴力破解的方法,遍历字符串数组,依次比较每个字符,如果都相等,则长度加一再比
阅读全文
摘要:leecode刷题(18) 报数 报数 描述: 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下: 被读作 ( ) , 即 。 被读作 ( ), 即 。 被读作 , " ( , ) , 即 。 给定一个正整数 n (1 ≤ n ≤ 30),输出报数序列的第 n 项。
阅读全文
摘要:leecode刷题(17) 实现StrStr 实现StrStr 描述: 实现 "strStr()" 函数。 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 1 。 示例 1:
阅读全文
摘要:leecode刷题(15) 验证回文字符串 验证回文字符串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明: 本题中,我们将空字符串定义为有效的回文串。 示例 1: 示例 2: 思路: 刚开始和上一题一样,我也没理解“回文字符串”是什么意思,后来想了下,“回文
阅读全文
摘要:leecode刷题(14) 有效的字母异位词 有效的字母异位词 描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的一个字母异位词。 示例 1: 示例 2: 说明: 你可以假设字符串只包含小写字母。 进阶: 如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来
阅读全文
摘要:leecode刷题(13) 字符串中的第一个唯一字符 字符串中的第一个唯一字符 描述: 给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 1。 案例: 注意事项: 您可以假定该字符串只包含小写字母。 思路: 1. 遍历字符串,取每个字符最早出现的位置; (charAt(
阅读全文
摘要:leecode刷题(12) 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1: 示例 2: 示例 3: 注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转
阅读全文