![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
文章平均质量分 53
是乔乔啊
我不留点什么总说我很懒
展开
-
76.二叉树的最近公共祖先
文章目录题目思路代码题目思路代码class Solution: def lowestCommonAncestor(self, root: TreeNode, p: TreeNode, q: TreeNode) -> TreeNode: if not root or root == p or root == q: return root left = self.lowestCommonAncestor(root.left, p, q原创 2022-05-26 10:26:31 · 62 阅读 · 0 评论 -
75.二叉搜索树额最近公共祖先
文章目录题目思路代码题目给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”思路迭代:1.循环搜索: 当节点 root 为空时跳出;当 p, q都在 root 的 右子树 中,则遍历至 root.right ;否则,当 p, q都在 root 的 左子树中,则遍历至 root.left ;否则原创 2022-05-26 10:16:49 · 65 阅读 · 0 评论 -
74.股票的最大利润
文章目录题目思路代码题目假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。思路贪心算法:维护一个买入的最小值,和一个卖出时的利润最大值即可。代码class Solution: def maxProfit原创 2022-05-26 09:12:35 · 115 阅读 · 0 评论 -
73.丑数
文章目录题目思路代码题目我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。思路动态规划代码class Solution: def nthUglyNumber(self, n: int) -> int: dp = [0] * (n + 1) dp[1] = 1 p2 = p3 = p5 = 1 for i in range(2, n + 1):原创 2022-05-20 09:01:22 · 82 阅读 · 0 评论 -
72.最长不含重复字符的子字符串
文章目录题目思路代码题目思路滑动窗口思路:可以用两个指针分别指向子串的左侧和右侧,每次左指针移动一格,右指针同时往右遍历,非重复元素添加到列表中,否则记录位置,跳出遍历。最后将每次记录的非重复子串的长度与前一次记录的最大值作比较,保留较大值。代码class Solution: def lengthOfLongestSubstring(self, s: str) -> int: # 哈希集合,记录每个字符是否出现过 occ = set()原创 2022-05-20 08:26:43 · 61 阅读 · 0 评论 -
71.把数字翻译成字符串
文章目录题目思路代码题目给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。例如:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”思路代码def translateNum(self, num) : i原创 2022-05-18 20:13:35 · 61 阅读 · 0 评论 -
70.树的子结构
文章目录题目思路代码题目输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。注意同[17.树的子结构]题目区分,此处结构和值包含即可,不必相等:(https://blog.csdn.net/qq_24889005/article/details/108284266)思路代码class Solution: def isSubStructure(self, A: TreeNode, B: TreeNo原创 2022-05-16 17:59:29 · 94 阅读 · 0 评论 -
69.删除链表的节点
文章目录题目思路代码题目给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。思路注意以下几种情形:1.链表是否存在2.第一个节点是否是需要删除的节点3.设置右表指针p,一直找到要删除节点的前一个节点,并指向这个节点4.对要删除节点的位置进行判断:(1)如果不是最后一个节点:p.next=p.next.next;(2)如果是最后一个节点:p.next=None代码# Definition for singly-linked list.# c原创 2022-05-15 23:35:54 · 85 阅读 · 0 评论 -
68.数值的整数次方
文章目录题目思路代码题目实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。思路代码class Solution: def myPow(self, x: float, n: int) -> float: def quickMul(N): if N == 0: return 1.0 y = quickMul(N // 2)原创 2022-05-15 23:02:23 · 72 阅读 · 0 评论 -
67.剪绳子II
文章目录题目思路代码题目思路核心思路是:尽可能把绳子分成长度为3的小段,这样乘积最大。步骤如下:1.如果 n == 2,返回1;2.如果 n == 3,返回2,两个可以合并成n小于4的时候返回n - 1;3.如果 n == 4,返回4;4.如果 n > 4,分成尽可能多的长度为3的小段,每次循环长度n减去3,乘积res乘以3;最后返回时乘以小于等于4的最后一小段;每次乘法操作后记得取余就行;以上2和3可以合并代码class Solution: def cuttingRop原创 2022-05-15 22:40:00 · 77 阅读 · 0 评论 -
66.剪绳子
文章目录1.题目2.思路3.代码1.题目给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。2.思路推理得到切分规则:3.代码class Solution: def cuttingRope(self, n: int) -&原创 2022-05-15 18:53:58 · 87 阅读 · 0 评论 -
65.机器人的运动范围
文章目录1.题目2.思路3.代码1.题目地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?2.思路思路:还是利用递归对矩阵进行深度优先搜索,从(0,0)位置出发,每成功走一步标记当前位置为true,然后从当前位原创 2020-09-12 21:41:36 · 99 阅读 · 0 评论 -
64.矩阵中的路径
文章目录1.题目2.思路3.代码1.题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则之后不能再次进入这个格子。 例如,在下面的3 X 4 矩阵中包含一条字符串"bfce"的路径,但是矩阵中不包含"abfb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。a b t gc f c sj原创 2020-09-12 21:33:01 · 86 阅读 · 0 评论 -
63.数据流中的中位数
文章目录1.题目2.思路3.代码1.题目如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。2.思路(1)定义一个列表(2)往列表中添加数据流中的数据(插入)(3)区分奇数和偶数的情况,奇数取中间数,偶数取中间两位数的平均数,注意取浮点数。3.代码# -*- cod原创 2020-09-12 15:05:17 · 88 阅读 · 0 评论 -
62.滑动窗口的最大值
文章目录1.题目2.思路3.代码1.题目给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2原创 2020-09-12 11:14:32 · 75 阅读 · 0 评论 -
61.二叉搜索树的第k个节点
文章目录1.题目2.思路3.代码1.题目给定一棵二叉搜索树,请找出其中的第k小的结点。例如,(5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。2.思路思路:如果是按中序遍历二叉搜索树的话,遍历的结果是递增排序的。所以只需要中序遍历就很容易找到第K个节点。3.代码# -*- coding:utf-8 -*-# class TreeNode:# def __init__(self, x):# self.val = x# self原创 2020-09-12 10:41:34 · 67 阅读 · 0 评论 -
60.按之字形顺序打印二叉树
文章目录1.题目2.思路3.代码1.题目请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。2.思路在上一题的基础上,加上flag标志判断,若flag为负表示偶数行,从右往左遍历。3.代码class Solution: def Print(self, pRoot): queue = [pRoot] res = [] flag = 1 #判断fla原创 2020-09-12 10:27:56 · 80 阅读 · 0 评论 -
59.把二叉树打印成多层
文章目录1.题目2.思路3.代码1.题目从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。给定二叉树: [3,9,20,null,null,15,7],2.思路用队列实现,root为空,返回空;队列不为空,记下此时队列中的节点个数temp,temp个节点出队列的同时,记录节点值,并把节点的左右子节点加入队列中。3.代码# class TreeNode:# def __init__(self, x):# self.val = x# s原创 2020-09-12 10:13:37 · 69 阅读 · 0 评论 -
58.对称的二叉树
文章目录1.题目2.思路3.代码1.题目请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。2.思路递归的思想,首先判断头结点是否为空。然后将根节点的左右两个节点假设成两个独立的树,如果左右两个树都为空,返回True。然后看左子树的左结点和右子树的右结点、左子树的右结点和右子树的左结点是否相同,都相同返回True.3.代码# -*- coding:utf-8 -*-# class TreeNode:# def __init__原创 2020-09-12 09:40:36 · 69 阅读 · 0 评论 -
57.二叉树的下一个节点
文章目录1.题目2.思路3.代码1.题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。2.思路如下图所示,二叉树的中序遍历序列是{d,b,h,e,i,a,f,c,g}。1、如果该节点有右子树,那么它的下一个节点就是它的右子树的最左侧子节点;2、如果该节点没有右子树且是父节点的左子树,那么下一节点就是父节点;3、如果该节点没有右子树且是父节点的右子树,比如i节点,那么我们往上找父节点,找到一个节点满足: 它原创 2020-09-12 09:26:04 · 147 阅读 · 0 评论 -
56.删除链表中重复的节点
文章目录1.题目2.思路3.代码1.题目在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。2.思路3.代码# -*- coding:utf-8 -*-# class ListNode:# def __init__(self, x):# self.val = x# self.nex原创 2020-09-11 14:39:11 · 71 阅读 · 0 评论 -
55.链表中环的入口节点
文章目录1.题目2.思路3.代码1.题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。2.思路(1)可以借鉴前面判断链表里面是否有环的思想:设立一个快指针,一个慢指针。快指针一次走两步,慢指针一次走一步。如果两个指针相遇,则表明链表中存在环。两个指针相遇的节点一定在环中。(2)此时相遇,再让慢指针重新指向链表头节点开始,快指针位置不变,每次快慢指针同时移动一步,再相遇时,所指位置就是环的入口节点。3.代码# -*- coding:utf-8 -*-# class原创 2020-09-11 14:18:19 · 109 阅读 · 0 评论 -
54.字符流中第一个不重复的字符
文章目录1.题目2.思路3.代码1.题目请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。2.思路设置一个栈,若新压入栈元素和栈中已有元素不重复则压入栈;否则移除栈中重复元素。最后返回栈底元素就是第一个不重复的字符。3.代码# -*- coding:utf-8 -*-class Solution: # 返回对应char原创 2020-09-11 11:10:20 · 114 阅读 · 0 评论 -
53.表示数值的字符串
文章目录1.题目2.思路3.代码1.题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。2.思路是否能够转为浮点数,可以的话可以表示数值;反之不能3.代码# -*- coding:utf-8 -*-class Solution: # s字符串 def isNumeric(self,原创 2020-09-11 10:50:59 · 93 阅读 · 0 评论 -
52.正则表达式匹配
文章目录1.题目2.思路3.代码1.题目请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配。2.思路3.代码...原创 2020-09-11 10:45:02 · 58 阅读 · 0 评论 -
51.构建乘积数组
文章目录1.题目2.思路3.代码1.题目给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]。不能使用除法。2.思路如果没有不能使用除法的限制,可以直接用累乘的结果除以A[i]。由于题目有限制,一种直观的解法是连乘n-1个数字,但时间复杂度是O(n^2)。可以把B[i]=A[0]A[1]…*A[i-1]A[i+1]…*A[n-1]分成A[0]A[1]…A[i-1]和A[i+1]…*A[n-1原创 2020-09-10 11:04:43 · 77 阅读 · 0 评论 -
50.数组中重复的数字
文章目录1.题目2.思路3.代码1.题目在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。2.思路使用set去重并保持原数组中元素相对位置不变,将去重后的列表扩容到原数组一般大,然后再进行逐个元素的比较。若不相同记录索引位置,在原始列表中找到该索引下的元素,就是第一个重复的元素。3.代原创 2020-09-10 10:55:18 · 149 阅读 · 0 评论 -
49.把字符串转换成整数
文章目录1.题目2.思路3.代码1.题目将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。输入描述:输入一个字符串,包括数字字母符号,可以为空输出描述:如果是合法的数值表达则返回该数字,否则返回0示例1:输入:+2147483647 ,输出:2147483647;输入:1a33,输出:0。2.思路符号位单独判断,然后判断符号后面原创 2020-09-10 09:49:30 · 114 阅读 · 0 评论 -
48.不用加减乘除做加法
文章目录1.题目2.思路3.代码1.题目写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。2.思路解法一:用求和函数sum解法二:位运算对数字做运算,除了加减乘除外,还有位运算,位运算是针对二进制的,二进制的运算有“三步走”策略:例如5的二进制是101,17的二进制10001。第一步:各位相加但不计进位,得到的结果是10100。第二步:计算进位值,只在最后一位相加时产生一个进位,结果是二进制10。第三步:把前两步的结果相加,得到的结果是10110。转换成十进制原创 2020-09-09 18:29:07 · 155 阅读 · 0 评论 -
47.求1+2+...+n的和
文章目录1.题目2.思路3.代码1.题目求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。2.思路递归,利用逻辑运算符判断。3.代码# -*- coding:utf-8 -*-class Solution: def Sum_Solution(self, n): # write code here return n and n+ self.Sum_Solution(n-原创 2020-09-09 11:08:02 · 156 阅读 · 0 评论 -
46.圆圈中剩下的数
文章目录1.题目2.思路3.代码1.题目游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列,不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后一个小朋友获胜,获胜的小朋友编号多少?(注:小朋友的编号是从0到n-1)2.思路类似循环列表原理。不断取余。3.代码# -*- coding:utf-8 -*-class Solution: def LastRemaining_Solut原创 2020-09-09 10:37:16 · 130 阅读 · 0 评论 -
45.扑克牌顺子
文章目录1.题目2.思路3.代码1.题目一副扑克牌,里面有2个大王,2个小王,从中随机抽出5张牌,如果牌能组成顺子就输出true,否则就输出false。为了方便起见,大小王是0,大小王可以当作任何数字。2.思路1、将数组排序 ;2、统计数组中0的个数,即判断大小王的个数;3、统计数组中相邻数字之间的空缺总数,如果空缺数小于等于大小王的个数,可以组成顺子,否则不行。如果数组中出现了对子,那么一定是不可以组成顺子的。3.代码# -*- coding:utf-8 -*-class Solution:原创 2020-09-09 10:25:55 · 210 阅读 · 0 评论 -
44.反转单词顺序列
文章目录1.题目2.思路3.代码1.题目例如,“student. a am I”翻转为“I am a student.”。2.思路思路:按空格切分为数组,依次入栈,再出栈(用空格连接)3.代码# -*- coding:utf-8 -*-class Solution: def ReverseSentence(self, s): # write code here if s is None or len(s) == 0: # 首先排除字符串不存在或为空的情况原创 2020-09-08 17:14:38 · 95 阅读 · 0 评论 -
43.左旋转字符串
文章目录1.题目2.思路3.代码1.题目对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。2.思路3.代码# -*- coding:utf-8 -*-class Solution: def LeftRotateString(self, s, n): # write code here res1 = s[n:] res2 = s[:n]原创 2020-09-08 15:39:37 · 123 阅读 · 0 评论 -
42.和为S的两个数字
文章目录1.题目2.思路3.代码1.题目输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。2.思路思路:由于是排好序的数组,因此对于和相等的两个数来说,相互之间的差别越大,那么乘积越小,因此我们使用两个指针,一个从前往后遍历,另一个从后往前遍历数组即可。3.代码# -*- coding:utf-8 -*-class Solution: def FindNumbersWithSum(self, array, t原创 2020-09-08 15:28:30 · 88 阅读 · 0 评论 -
41.和为S的连续正数序列
文章目录1.题目2.思路3.代码1.题目输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。思路:维护两个指针,一个指针指向这个连续正数序列的开始,一个指向连续正数序列的结束,判断当前的序列和与目标的关系,不断更新这两个指针的位置。2.思路3.代码...原创 2020-09-08 11:11:33 · 67 阅读 · 0 评论 -
40.数组中只出现一次的数字
文章目录1.题目2.思路3.代码1.题目一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。2.思路解法一:用count方法。解法二:不用内置count方法。3.代码解法一:count()# -*- coding:utf-8 -*-class Solution: # 返回[a,b] 其中ab是出现一次的两个数字 def FindNumsAppearOnce(self, array): # write code here原创 2020-09-03 15:38:48 · 356 阅读 · 0 评论 -
39.平衡二叉树
文章目录1.题目2.思路3.代码1.题目输入一个二叉树,判断是否是平衡二叉树。平衡二叉树:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。2.思路利用38题中判断二叉树最大深度的函数,左子树和右子树的深度差小于等于1即为平衡二叉树。3.代码class Solution(object): def isBalanced(self, root): if root == None: return True elif abs(原创 2020-09-03 14:09:39 · 92 阅读 · 0 评论 -
38.二叉树的深度
文章目录1.题目2.思路3.代码1.题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。示例:给定二叉树 [3,9,20,null,null,15,7]。2.思路递归的方法,比较左边路径和右边路径哪边最长,选择最长的一边路径,加上root结点本身的长度。3.代码class Solution(object): def maxDepth(self, root): if root is None:原创 2020-09-03 14:03:37 · 83 阅读 · 0 评论 -
37.统计一个数字在排序数组中的出现的次数
文章目录1.题目2.思路3.代码1.题目统计一个数字在排序数组中的出现的次数。2.思路解法一:从头到尾遍历,时间复杂度为O(n)。解法二:考虑数组为空的情况,直接返回0;双指针,找到i和j的位置,时间复杂度为O(n/2)。解法三:二分查找算法。我 们意识到,数字出现的次数=index(最后一个)-index(第一个)+1.因此可以采用二分查找算法找到第一个和最后一个重复数字出现的位置。先拿数组中间的数字和要统计的目标值k作比较:若data[mid]>k,k只可能出现再数组的前半段;原创 2020-09-03 13:53:53 · 825 阅读 · 0 评论