- 博客(52)
- 收藏
- 关注
原创 剑指offer--正则表达式的匹配and 表示数值的字符串
引用k神代码题目:请实现一个函数用来匹配包含'. '和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但与"aa.a"和"ab*a"均不匹配。示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。代码:class Solution: def
2022-05-14 17:38:42
352
原创 剑指offer--数组中的逆序对and滑动窗口的最大值
题目1:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。示例 1:输入: [7,5,6,4]输出: 5思路:归并排序算法。可以在归并排序最后将小数组变为大数组的时候,用两个指针分别指向左边数组和右边数组,判断i和j的关系,如果nums[i]>nums[j],那从i到mid的元素都可以和j形成逆序对,加上相对应的mid-i+1就可以了。主要代码还是归并排序算法,只不过在归并排序的合并的时候,加上一行代码进行了判
2022-05-14 17:36:09
242
原创 剑指offer--序列化二叉树
题目:请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。思路:首先我们要清楚这一道题是要我们做什么,就是把一个二叉树序列化为字符串,也就是将每一位都变为字符串;但是还要再返回来,将字符串每一位都变为二叉树中的节点,关键就是变回来的时候是不能变化位置的,所以这里就要求我们将空的节点也以null存放到字符串中。遍历
2022-05-13 17:36:19
248
原创 剑指offer--数据流中的中位数and 1-n整数中1出现的次数
题目1:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。例如,[2,3,4] 的中位数是 3[2,3] 的中位数是 (2 + 3) / 2 = 2.5设计一个支持以下两种操作的数据结构:void addNum(int num) - 从数据流中添加一个整数到数据结构中。double findMedian() - 返回目前所有元素的中位数。示例 1
2022-05-13 17:21:01
211
原创 剑指offer--把字符串转化为整数
题目:写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如
2022-05-13 17:08:55
88
原创 剑指offer--二叉搜索树的最近公共祖先以及二叉树的最近公共祖先
题目:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6
2022-05-11 17:13:38
210
原创 剑指offer--求1+2+…+n and 构建乘积数组 and 不用加减乘除做加法(从更深的角度考虑机器运算的方式)
题目1:求 1+2+...+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路:这一题如果没有限制条件那是非常简单的,但是题目要求我们不能使用关键字和乘除法,不过递归肯定还是这一道题的破解之处,我们只需要找到一个关键点,那就是什么时候递归截至。除了条件判断之外还有一个方法可以用来判断截至,那就是或运算和与运算,a&&b,如果a 是假的,&&后面的就不会执行,这就是我们的突破口。代码:
2022-05-09 20:24:06
425
原创 剑指offer--圆圈中最后剩下的数字(约瑟夫环的问题)
题目:0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出:3思路:写这道题大概碰到了三个思路,其中第一个不够完善,情况少了一种没有分析清楚思路一:将删除数字前面的数字切下来,拼接到最后,实.
2022-05-08 17:24:25
174
原创 剑指offer--股票的最大利润and扑克牌中的顺子
题目一:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。思路一:暴力解题,肯定超时,双循环ij,j是当前i后面的所有元素,然后计算每一个i中的profit的最大值,最后比较,返回值...
2022-05-08 16:02:29
406
原创 剑指offer--翻转单词顺序and左旋转字符串
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。示例 1:输入: "the sky is blue"输出:"blue is sky the"示例 2:输入: " hello world! "输出:"world! hello"解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输...
2022-05-08 15:50:32
96
原创 剑指offer--队列的最大值
题目:请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1思路:这种让我们自己写出来一个api的题,需要考虑用哪种方法写出来的效率比较高,根据功能需求直接写就可以代码:class MaxQueue: def __init__(self): self.queue=[]
2022-05-07 17:50:43
91
原创 剑指offer--n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。思路:这种题第一反应肯定是想要直接暴力解题,找到所有的可能,算出每个可能的概率,但是作为算法题,这样肯定是超时了,时间复杂度太高,那就要想其他的方法。发现前n个骰子的所有可能出现的和的概率对第n+1个骰子所有可能出现的和是有贡献的。假设f(n)表示n个骰子所有的和出现的概率,那n个骰子的
2022-05-07 17:47:33
226
原创 剑指offer--数组中数字出现的次数Ⅱ
题目:在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例 1:输入:nums = [3,4,3,3]输出:4思路1:本题跟上一题的出现次数还不相同,上次的是每个数字出现了两次,找出现一次的那个数字,所以可以使用依次相异或的方法,最后的结果就是要找的数。但是这一道题有三个相同的数,没有办法使用异或,但是依然可以使用数位相加的方法,将所有数的二进制数的每一位都相加,最后每一位和3求余,得到的结果就是出现一次的数的二进制数,因为出现三次的数二
2022-05-06 17:10:10
210
原创 剑指offer--和为s的两个数字and和为s的连续正数序列
题目1:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]思路:这一道题没有时间和空间的限制,我们可以采用两种方法来进行解题第一种,可以使用hashset的方法,可以把数组中的数字存储到hashset中去,判断hashset中是否有target-i的值,有的话直接返回(题目要求返回一个即可)代码:
2022-05-06 16:59:45
151
原创 剑指offer--数组中数字出现的次数
题目:一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]思路:这里的时间复杂度和空间复杂度都要求的很低,所以只能使用数位计算代码:class Solution: def singleNumbers(self, nums: List[int]) -> List[int]: #
2022-05-05 17:16:49
982
原创 剑指offer--二叉树的深度and
题目:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度3 。思路:采用递归计算左子树和右子树的高度,然后取最大值代码:# Definition for a binary tree node.# class TreeNode:# ...
2022-05-05 17:14:54
158
原创 剑指offer--最长不含重复字符的子字符串and丑数问题
题目1:请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。示例 1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。思路一:这里我是有两个思路的,第一次写的时候想着直接暴力列出所有的子字符串,应该也可以通过,但是事实证明会超时,主要是时间复杂度太高了,首先暴力列出所有的子字符串都已经有了O(N^2)的时间复杂度,后面判断是否含有重复还要花费O(N)的复杂度,不通过也很正常,不过这里还是把代码贴过来,.
2022-05-04 21:10:09
161
原创 剑指offer--二叉搜索树的第k大节点
题目:给定一棵二叉搜索树,请找出其中第 k 大的节点的值。思路:二叉搜索树是左子树都小于根节点,右子树都大于根节点的树,可以有的思路是从最右子树开始找,然后找到某个节点。这里我才用中序遍历将二叉搜索树添加到列表中去,然后找到第k大的值。代码:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left
2022-05-04 20:40:42
229
原创 剑指offer--把数字翻译成字符串and把数组排成最小的数and数字序列中某一位的数字
题目:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"思路:因为组合的之后数字的范围也要限定在26以内,即使前后两个数组合了也是要求10到25,才会多一
2022-05-02 16:20:44
110
原创 剑指offer--字符串的排列&&复杂链表的复制&&二叉搜索树与双向链表
题目:38题,多思考输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]思路:回溯class Solution: def permutation(self, s: str) -> List[str]: #标记 c, res = list(s), [] d
2022-05-01 17:23:15
759
原创 剑指offer--最大礼物问题&&二叉树中路径等于目标值的问题&&二叉搜索树的后序遍历序列
题目:在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?思路:第一反应是递归,但是这道题用动态规划就可以class Solution: def maxValue(self, grid: List[List[int]]) -> int: #每个礼物都是正值,所以肯定是累加到最
2022-04-30 17:08:05
339
原创 剑指offer--栈的压入、弹出序列
题目描述:输入两个整数序列,第一个序列来表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。思路:这一道题我们可以找一个辅助栈来帮助我们进行压入和弹出的操作,大致思路就是依次把每个元素都先压入栈,也可以随时出栈,但是出栈是有条件的,只有当前栈里面有元素而且栈顶元素就等于出栈队列的对应的元素
2022-04-29 19:55:20
203
原创 剑指offer--三道从上到下打印二叉树(依次增加条件)
题目一:从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树:[3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回:[3,9,20,15,7]思路:第一题的思路自然就比较简单,既然让层级遍历,那就采用广度优先遍历,而广度优先遍历需要用到队列的方法。即先将该层的节点放入到队列中去,接着依次取出队列的头部,然后将节点的val加入到列表res中去,遍历完该节点之后,还要判断该...
2022-04-29 19:46:44
468
原创 剑指offer--树的子结构
题目描述:输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A:3/ \4 5/ \1 2给定的树 B:4/1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。思路:树是天然的递归结构,这里可以考虑两次递归的用法首先是isSubStructure函数,用来遍历树A,查询B的根节点是否在A中...
2022-04-28 15:01:00
173
原创 剑指offer--剪绳子问题1,2
题目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。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1思路:剪绳子问题用到了数学推导,假设将绳子分为a份,每份是n1,n2...n
2022-04-28 14:42:25
343
原创 剑指offer--机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1输出:3提示:1 <= n
2022-04-28 09:57:25
182
原创 剑指offer--矩阵中的路径
题目:给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。例如,在下面的 3×4 的矩阵中包含单词 "ABCCED"(单词中的字母已标出)。示例 1:输入:board = [["A","B","C","E"],["S","F","C","
2022-04-28 09:49:20
129
原创 剑指offer--包含min函数的栈
题目要求:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); -->...
2022-04-24 19:01:36
650
原创 剑指offer--顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]思路:题目要求我们顺时针打印,那我们就可以为矩阵做四个边界,每一个边界打印完之后朝着里面缩进去,直到上下左右的某两个边界重叠,就break出来。先打印上面一行,再打印右边一行,再打印下面一行,最后打印左边一行,每次打印都把对应的边界值减一或者加一。代码:class Solution:
2022-04-24 18:57:06
99
原创 剑指offer--对称的二叉树
题目:思路:看到二叉树最常见的还是使用递归,但是递归应该怎么使用呢思路肯定是左右子树直接比较,看是否相等,左子树的左孩子要和右子树的右孩子作比较,左子树的右孩子要和右子树的左孩子比较,然后依次递归。首先排除掉特殊情况,第一种情况,root直接就是空的,那就返回true,第二种情况,只有左孩子或者只有右孩子或者有两个孩子但是孩子不相等,这都是不对称的,返回false,然后就到了递归的部分,直接return 递归(root.left.left,root.right.right)and 递归(root
2022-04-24 18:52:49
434
原创 剑指offer--从上到下打印二叉树
题目:思路:二叉树的层级打印,最重要的就是多了一个层级,需要分层打印出来,这里的思路有两种,第一种是直接打印,第二种是递归打印。层级遍历:参考k神,很多代码处理的太好了。这里他的层级打印为了打印出来每层,多用了一个for循环,循环的次数就是len(queue),queue里面存放的是当前层级的节点。队列可以使用两端队列或者普通列表来实现。代码:双端队列# Definition for a binary tree node.# class TreeNode:# def
2022-04-23 11:05:09
148
原创 剑指offer--二叉树的镜像
题目:思路:二叉树的递归,就要像碰见有序列表我们都想二分查找快速排序一样敏感,碰见二叉树很多问题都会用到递归。这道题有两种递归方式,第二种参考了k神的做法。第一种:分别递归每一个节点,当没法递归的时候,说明已经到了最下面的叶节点,然后交换两个叶节点的值,将原来的左节点作为右节点。代码:# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val
2022-04-23 10:48:08
467
原创 剑指offer--数组中查找指定数出现的次数
统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2class Solution: def search(self, nums: List[int], target: int) -> int: count=collections.Counter(nums) return count[target]...
2022-04-21 16:08:24
219
原创 剑指offer--两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有
2022-04-21 16:06:43
85
原创 剑指offer--0~n-1中缺失的数字
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2思路一:思路一虽简单,但是时间复杂度太高,不建议用代码:class Solution: def missingNumber(self, nums: List[int]) -> int: #时间复杂度高 #循环0-n-1内的所有的数
2022-04-21 16:00:56
337
原创 剑指offer--合并两个有序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4思路1:使用另外一个链表来连接上面的两个链表,但是要注意有一个第三个链表的伪头节点,方便我们输出第三个链表代码:class Solution: def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> List
2022-04-20 16:48:28
364
原创 剑指offer--连续子数组的最大和
输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释:连续子数组[4,-1,2,1] 的和最大,为6。思路:最简单的方法是暴力列出所有的可能子数组,求值,但是时间复杂度高;使用动态规划,sum[i]列表中存放的是前i个nums列表中的和,如果nums[i-1]>0,说明对sum[i]有帮助,那就把它拿进来,小于零就直接不...
2022-04-20 16:41:29
335
原创 剑指offer--数组中出现次数超过一半的数字&& 最小的k个数
题目一:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2思路:直接统计次数,比较输出就可以代码:class Solution: def majorityElement(self, nums: List[int]) -> int: count=collections.Counter(nums
2022-04-20 16:37:09
194
原创 剑指offer--链表中倒数第k个节点&&反转链表
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.思路:这道题我只有一个思路,大佬的另一个思路题解没看太明白,有点太妙了,这里还是写上我的普通的思路。我们的链表都会是顺着访
2022-04-19 19:34:34
142
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人