剑指Offer
文章平均质量分 59
记录剑指offer中所有的面试题,python语言实现
星尘 StarDust
Datawhale团队成员,开源贡献者,一个不断寻找自我的追光者。
展开
-
剑指 Offer 14- II. 剪绳子 II -- 贪心算法
0 题目描述leetcode原题链接:剑指 Offer 14- II. 剪绳子 II1 贪心算法此题与 面试题14- I. 剪绳子 主体等价,唯一不同在于本题目涉及 “大数越界情况下的求余问题” 。本题用动态规划比较复杂,还是要看贪心。核心思路是:尽可能把绳子分成长度为3的小段,这样乘积最大。具体证明请参考后面的参考资料链接。求解步骤如下:如果 n == 2,返回1,如果 n == 3,返回2,两个可以合并成n小于4的时候返回n - 1如果 n == 4,返回4如果 n > 4,分原创 2021-07-11 12:24:27 · 456 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子 -- 动态规划
0 题目描述leetcode原题链接:剑指 Offer 14- I. 剪绳子1 动态规划想要求长度为n的绳子剪掉后的最大乘积,可以从前面比n小的绳子转移而来用一个dp数组记录从0到n长度的绳子剪掉后的最大乘积,也就是dp[i]表示长度为i的绳子剪成m段后的最大乘积,初始化dp[2] = 1先把绳子剪掉第一段(长度为j),如果只剪掉长度为1,对最后的乘积无任何增益,所以从长度为2开始剪剪了第一段后,剩下(i - j)长度可以剪也可以不剪。如果不剪的话长度乘积即为j * (i - j);如果剪的原创 2021-07-11 12:14:07 · 503 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点 -- 双指针
0 题目描述leetcode原题链接:剑指 Offer 18. 删除链表的节点1 双指针解法删除值为 val 的节点分需为两步:定位节点、修改引用。定位节点: 遍历链表,直到 head.val == val 时跳出,即可定位目标节点。修改引用: 设节点 cur 的前驱节点为 pre ,后继节点为 cur.next ;则执行 pre.next = cur.next ,即可实现删除 cur 节点。# Definition for singly-linked list.# class Lis原创 2021-07-11 11:58:36 · 465 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树 -- 递归
0 题目描述leetcode原题链接:剑指 Offer 07. 重建二叉树1 递归解法二叉树前序遍历的顺序为:先遍历根节点;随后递归地遍历左子树;最后递归地遍历右子树。二叉树中序遍历的顺序为:先递归地遍历左子树;随后遍历根节点;最后递归地遍历右子树。在「递归」地遍历某个子树的过程中,是将这颗子树看成一颗全新的树,按照上述的顺序进行遍历。挖掘「前序遍历」和「中序遍历」的性质,就可以得出本题的做法。# Definition for a binary t原创 2021-07-11 11:42:09 · 177 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树 -- 递归
0 题目描述leetcode原题链接:剑指 Offer 55 - II. 平衡二叉树1 自顶向下的递归这道题中的平衡二叉树的定义是:二叉树的每个节点的左右子树的高度差的绝对值不超过 11,则二叉树是平衡二叉树。根据定义,一棵二叉树是平衡二叉树,当且仅当其所有子树也都是平衡二叉树,因此可以使用递归的方式判断二叉树是不是平衡二叉树,递归的顺序可以是自顶向下或者自底向上。这道题是计算二叉树深度的扩展,定义计算二叉树深度函数maxDepth(),即可判断二叉树是否平衡。具体做法类似于二叉树的前序遍历,即对原创 2021-01-07 22:42:19 · 267 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像 -- 递归
0 题目描述leetcode原题链接:剑指 Offer 27. 二叉树的镜像1 递归算法根据二叉树镜像的定义, 考虑递归遍历 dfs\mathrm{dfs}dfs 二叉树,交换每个节点的左 / 右子节点, 即可生成 二叉树的镜像。递归解析:终止条件:当节点 root 为空时 (即越过叶节点),则返回 null ;递推工作:初始化节点 tmp,t m p,tmp, 用于暂存 root 的左子节点;开启递归 右子节点 mirrorTree(root.right),并将返回值作为 root原创 2021-01-07 15:02:04 · 222 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树 -- 递归
0 题目描述leetcode原题链接:剑指 Offer 28. 对称的二叉树1 递归解法在这里插入代码片参考资料原创 2021-01-07 10:04:23 · 204 阅读 · 2 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 -- 递归
0 题目描述leetcode原题链接:剑指 Offer 68 - I. 二叉搜索树的最近公共祖先1 递归解法# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def lowestCommo原创 2021-01-06 22:45:15 · 230 阅读 · 8 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先 -- 递归
0 题目描述leetcode原题链接:剑指 Offer 68 - II. 二叉树的最近公共祖先1 递归解法代码思路:递归查询两个节点p q,如果某个节点等于节点p或节点q,则返回该节点的值给父节点。如果当前节点的左右子树分别包括p和q节点,那么这个节点必然是所求的解。如果当前节点有一个子树的返回值为p或q节点,则返回该值。(告诉父节点有一个节点存在其子树中)如果当前节点的两个子树返回值都为空,则返回空指针。# Definition for a binary tree node.# cla原创 2021-01-06 15:31:20 · 215 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表 --递归与双指针解法
0 题目描述leetcode原题链接:剑指 Offer 25. 合并两个排序的链表1 双指针解法# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode原创 2021-01-05 22:55:41 · 169 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度 --后续遍历
0 题目描述leetcode原题链接:剑指 Offer 55 - I. 二叉树的深度1 后续遍历找出 root 的左子树和右子树的深度,然后取其较大的值 +1 即可(因为 root 本身也有一个单位的深度)。后序遍历,也叫深度优先搜索(DFS),往往利用递归或者栈来实现。# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x#原创 2021-01-05 22:24:56 · 221 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方 -- 快速幂
0 题目描述leetcode原题:剑指 Offer 16. 数值的整数次方1 快速幂解法快速幂实际上是二分思想的一种应用。二分推导: xn=xn/2×xn/2=(x2)n/2,x^{n}=x^{n / 2} \times x^{n / 2}=\left(x^{2}\right)^{n / 2},xn=xn/2×xn/2=(x2)n/2, 令 n/2n / 2n/2 为整数, 则需要分为奇偶两种情况(设向下取整除 法符号为 " //"/ / "//" ) :∘\circ∘ 当 nnn 为偶数: x原创 2021-01-05 20:15:32 · 266 阅读 · 6 评论 -
剑指 Offer 53 - I. 在排序数组中查找数字 I
0 题目描述leetcode原题链接:剑指 Offer 53 - I. 在排序数组中查找数字 I1 二分查找解题思路:排序数组中的搜索问题,首先想到 二分法 解决。排序数组 nums 中的所有数字 target 形成一个窗口,记窗口的 左 / 右边界 索引分别为 left 和 right ,分别对应窗口左边 / 右边的首个元素。本题要求统计数字 target 的出现次数,可转化为:使用二分法分别找到 左边界 left 和 右边界 right ,易得数字 target 的数量为right−lef原创 2020-12-31 22:43:14 · 156 阅读 · 0 评论 -
剑指Offer03 -- 数组中重复的数字 哈希表
0 题目描述leetcode原题链接:剑指 Offer 03. 数组中重复的数字1 排序查找数组排序之后,重复元素一定是相邻的,然后前后两两比较,如果有重复的直接返回。class Solution: def findRepeatNumber(self, nums: List[int]) -> int: if not nums or len(nums)<=1: return -1 nums.sort() for i in range原创 2020-11-08 12:57:57 · 534 阅读 · 0 评论