
剑指offer
文章平均质量分 65
剑指offer基础算法练习
庄小焱
我是庄小焱,某大厂Java高级工程师、PMP项目管理专家、系统架构设计师(高级)、CSDN博文专家。博主在支付交易领域,信贷金融领域、机器学习模型算法领域深耕,我在博客中分享业务、技术、产品相关知识,欢迎大家和我交流学习。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Leetcode(每日一题)——1140. 石子游戏 II
两人交替拿石子,为了在 i 尽量小的情况下,使 M 尽量大,那么每次都拿满M堆,最后有(2+4+8+⋯+M)+2M原创 2023-02-22 09:16:28 · 453 阅读 · 0 评论 -
Leetcode(每日一题)——1234. 替换子串得到平衡字符串
因为我们在搜索过程中要时刻判断「不替换的内容」中四个字符的出现次数是否小于等于n/4,因此我们必须先遍历一遍整个字符串,得到字符的总共出现次数【初始化断「不替换的内容」中四个字符的出现次数,表示初始子串为空】,然后在滑动窗口的移动过程中,动态的增加或减少对应字符出现的次数,来维护「不替换的内容」中四个字符的出现次数。【子串不合法,就说明「不替换的内容」中存在至少一个字符的出现次数大于n/4,我们就要通过加长子串,从而缩短「不替换的内容」,期望多的字符被加入子串,使得「不替换的内容」可能满足】。原创 2023-02-13 22:16:48 · 400 阅读 · 0 评论 -
Leetcode(每日一题)——2335. 装满杯子需要的最短总时长
【代码】Leetcode(每日一题)——2335. 装满杯子需要的最短总时长。原创 2023-02-11 10:47:39 · 126 阅读 · 0 评论 -
Leetcode(每日一题)——1754. 构造字典序最大的合并字符串
假设 word1[i]=word2[j],此时两个字符串分别从 i,j开始还有 l 个字符相等,则此时word1[i+k]=word2[j+k],k∈[0,l−1]第 l+1 个字符时二者不相等,即满足 word1[i+l]≠word2[j+l],我们可以假设 word1[i+l]原创 2022-12-24 12:59:22 · 833 阅读 · 1 评论 -
Leetcode(每日一题)——1626. 无矛盾的最佳球队
首先我们将所有队员按照分数升序进行排序,分数相同时,则按照年龄升序进行排序,我们用数组 people[n][2] 来表示排序后的 n名球员信息,其中 people[i][0],people[i][1]分别为排序后第i名球员的分数和年龄。球队的得分是球队中所有球员分数的总和,现在我们需要求所有可能的无矛盾的球队的最高分数。上文讨论的是建立在i>0的前提上的,我们还需要考虑动态规划的边界条件,当i=0时,只有一名球员people[0],此时该球员单独组成一只队伍有:dp[0]=people[0][0]。原创 2023-03-22 11:03:20 · 260 阅读 · 0 评论 -
Leetcode(每日一题)——2357. 使数组中所有元素都等于零
需要注意的是,由于目标是将数组中的所有元素减少0,如果数组中的一个元素已经是0则不需要对该元素执行操作,因此只需要考虑数组中的不同非零元素的个数。由于每次操作都将数组中的所有非零元素减少一个相同的值,因此数组中的相等元素减少到0 的操作数相等,数组中的不相等元素减少到0的操作数不相等。又由于使用贪心策略操作时,每次操作都会将数组中的最小非零元素减少到0,因此最少操作数等于数组中的不同非零元素的个数。,则哈希集合的大小等于数组中的不同非零元素的个数,即为最少操作数。使用哈希集合存储数组中的所有。原创 2023-02-24 09:28:18 · 353 阅读 · 0 评论 -
Leetcode(每日一题)——1092. 最短公共超序列
为了描述方便,下文把str1记作s,str2str2 记作t。对于 s=abac和 t=cab,考虑从后往前构造答案(最短公共超序列)。想一想,答案的最后一个字母是什么?要么是s 的最后一个字母c,要么是t的最后一个字母b。其它字母是没有意义的,假设答案为 cabaca,最后一个字母是a,你完全可以把a去掉,不会影响s 和t作为答案的子序列。无论如何,我们都得到了一个规模更小的子问题,即构造s的某个前缀与t的某个前缀的最短公共超序列。由于子问题与原问题是相似的,可以采用递归解决。原创 2023-03-28 08:35:37 · 389 阅读 · 1 评论 -
Leetcode(每日一题)——2367. 算术三元组的数目
如果 j原创 2023-03-31 07:47:48 · 406 阅读 · 0 评论 -
Leetcode(每日一题)——2469. 温度转换
Java有两种浮点数据类型,第一种float使用32 bit表示,对应单精度浮点数,运行速度相比double更快,占内存更小,但是当数值非常大或者非常小的时候会变得不精确。精度要求不高的时候可以使用float类型。基本类型double占8个字节,二进制位数有64位,取值范围为[-1.79769313486231570e+308,-4.94065645841246544e-324] ∪ [4.94065645841246544e-324,1.79769313486231570e+308]。原创 2023-03-21 17:39:21 · 289 阅读 · 0 评论 -
Leetcode(每日一题)——2341. 数组能形成多少数对
另外Hashmap的思路:遍历一次数组,用一个哈希表保存元素个数的奇偶性,偶数为false,奇数则为true。每遇到一个元素,则将奇偶性取反,若取反完后为偶数个,则表明在上次偶数个之后又遇到了两个该元素,可以形成一个数对。最后返回一个数组,第一个元素是数对数,第二个元素是数组长度减去数对数的两倍。思路:遍历一遍数组,将数组存储在hasmap中,然后在遍历一遍Hashmap的元素。分别设置两个计数器,记录该元素对2除的结果和对2取余数的结果。最后返回这个两个数据就是结果。原创 2023-02-16 09:15:51 · 151 阅读 · 0 评论 -
Leetcode(每日一题)——1630. 等差子数组
要想判断某个子数组是否可以重新排列成等差数列,最简单的方法是建立一个等长度的临时数组,将子数组进行拷贝并排序。对于排完序后的子数组,我们只需要进行一次遍历,判断相邻两个元素的差值是否保持不变,就能判断出它是否为等差数列。原创 2023-03-23 21:34:01 · 180 阅读 · 0 评论 -
Leetcode(每日一题)——1138. 字母板上的路径
假设两个字符 a,b在画板中的位置分别为(xa,ya),(xb,yb),其中xa,xb表示字符 a,b的行坐标,ya,yb表示字符 a,b的列坐标。假设当前处在字符 a处,需要移动到字符 b,此时只需先上下移动 ∣xa−xb∣个位置,再左右移动 ∣ya−yb∣个位置,再执行一次添加操作即可完成字符 b的添加。由于字符 ‘z’所在的行只有一列,从其他字符移动到字符 ‘z’时,必须先移动到字符 ‘u’,再向下移动到 ‘z’,最后一步操作一定是下移。空间复杂度:O(1)。原创 2023-02-12 10:15:30 · 151 阅读 · 0 评论 -
Leetcode(每日一题)——1487. 保证文件名唯一
如果name在哈希表中,那么说明文件系统已经存在名为name的文件夹,我们在哈希表找到 name的下一后缀序号k,逐一尝试直到添加后缀k的新文件名不存在于哈希表中,然后创建该文件夹。需要注意的是,创建该文件夹后,有两个文件名的下一后缀序号需要修改,首先文件名name的下一后缀序号为k+1,其次,文件名name添加后缀 kk 的新文件名的下一后缀序号为1。如果name不在哈希表中,那么说明文件系统不存在名为name的文件夹,我们直接创建该文件夹,并且记录对应文件夹的下一后缀序号为1。空间复杂度:O(m)。原创 2023-03-03 13:47:08 · 170 阅读 · 0 评论 -
Leetcode(每日一题)——2373. 矩阵中的局部最大值
设grid的大小n×n,那么我们申请一个大小为(n−2)×(n−2)的矩阵 resres 用来存放答案。我们遍历 grid中每个3×3子矩阵的左上角,然后统计当前子矩阵的最大值放入res中。具体做法是,我们顺序遍历 i (0≤i原创 2023-03-01 07:24:08 · 291 阅读 · 0 评论 -
Leetcode(每日一题)——2347. 最好的扑克手牌
我们只需要给出我们手中的5张扑克能够组成最好手牌类型。因为扑克牌的大小和花色是独立的。首先将我ranks和suits分别放入哈希表中计数,然后在判断我们当前手牌的类型。我们结果只可能是的四种情况。原创 2023-02-20 09:19:11 · 508 阅读 · 0 评论 -
Leetcode(每日一题)——1616. 分割两个字符串得到回文串
这个字符串的起始位置是由a组成的,末尾位置是由b构成的。要想构成回文,起始的部分和末尾的部分必须是倒序相等的,这个可以用双指针来逐位判断。当遇到不相等的情况时,则说明遇到了分割点,分割的位置可能是左侧的指针,也可能是右侧的指针。如果分割点是左侧的指针,则需要b在双指针之间的字符串构成回文;如果分割点是右侧的指针,则需要a 在双指针之间的字符串构成回文。这二者满足其一即可。记字符串的长度为n,分割的下标为k,即下标k之前的字符构成前缀,下标k和之后的字符构成后缀,前缀长度为k,后缀长度为n−k,0≤k≤n。原创 2023-03-18 11:17:17 · 229 阅读 · 0 评论 -
Leetcode(每日一题)——831. 隐藏个人信息
我们首先判断s是邮箱还是电话号码。显然,如果s中有字符‘@’,它是邮箱,否则是电话号码。原创 2023-04-02 08:40:21 · 361 阅读 · 1 评论 -
Leetcode(每日一题)——1250. 检查「好数组」
【代码】Leetcode(每日一题)——1250. 检查「好数组」原创 2023-02-15 09:20:37 · 178 阅读 · 0 评论 -
Leetcode(每日一题)——1144. 递减元素使数组呈锯齿状
即为了使某一个奇数下标位置i满足要求的最少操作次数 Ci=max(p[i]−q(i)+1,0) 其中 q(i)表示数组 p中位置i相邻元素的最小值,因为若我们对某个偶数下标的元素进行了操作,则该元素相邻的奇数下标元素所需要的操作次数只增不减,但是总的操作次数一定增加了,所以最优解中一定不会存在对偶数下标操作的情况。那么我们对 nums中每一个奇数位置i的ci求和即为此时求每一个偶数索引对应的元素都大于其相邻的元素的「锯齿数组」的最少操作的次数。原创 2023-02-28 22:05:29 · 228 阅读 · 0 评论 -
Leetcode(每日一题)——1139. 最大的以 1 为边界的正方形
如下图所示,我们以橙色的位置1为正方形的右下角,分别沿着左边和上边找出他们连续1的个数,最小的作为正方形的边长。如果我们能计算出所有dp(i,j) 的值,那么其中的最大值即为矩阵中只包含1的正方形的边长最大值,其平方即为最大正方形的面积。如果该位置的值是 1,则 dp(i,j)的值由其上方、左方和左上方的三个相邻位置的dp值决定。确定正方形的左上角后,根据左上角所在的行和列计算可能的最大正方形的边长(正方形的范围不能超出矩阵的行数和列数),在该边长范围内寻找只包含 1 的最大正方形;原创 2023-02-17 08:21:22 · 493 阅读 · 0 评论 -
Leetcode(每日一题)——1792. 最大平均通过率
【代码】Leetcode(每日一题)——1792. 最大平均通过率。原创 2023-02-19 10:18:05 · 309 阅读 · 0 评论 -
Leetcode(每日一题)——2389. 和有限的最长子序列
给你一个长度为n的整数数组nums ,和一个长度为m的整数数组queries。返回一个长度为m的数组answer ,其中answer[i] 是 nums中元素之和小于等于queries[i] 的子序列的最大长度。子序列是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。由于选取的元素没有连续的要求,因此可以对数组进行排序。原创 2023-03-17 08:52:07 · 486 阅读 · 0 评论 -
Leetcode(每日一题)——1237. 找出给定方程的正整数解
由于 (x,y)的初始值分别为 (0,n−1),因此y 最多能被减少n次,x最多能被增加m 次,总搜索次数为 m+n。当我们固定 x=x0时,函数 g(y)=f(x0,y)是单调递增函数,可以通过二分查找来判断是否存在 y=y0,使 g(y0)=f(x0,y0)=z成立。根据题目给出的x和y的取值范围,枚举所有的 x,y数对,保存满足f(x,y)=z的数对,最后返回结果。时间复杂度:O(m+n),其中m是x的取值数目,n是y的取值数目。时间复杂度:O(mn),其中m是x的取值数目,n是y的取值数目。原创 2023-02-18 10:02:57 · 419 阅读 · 0 评论 -
Leetcode(每日一题)——1124. 表现良好的最长时间段
具体的,我们遍历 i (0≤i≤r−1),如果 stk为空或者栈顶元素大于s[i],则将s[i]入栈。求解l时,我们不断的弹出栈顶元素,直到栈顶元素是最后一个小于 s[r]的元素,此时栈顶元素所在位置即为我们要求的l。至此,我们只需求解最长的一段区间 [l,r] 使得 s[r]−s[l]>0,其中0≤l≤r≤n。设 n 为 hours的长度,从小到大遍历 i (1≤i≤n),若 hours[i−1]>8,则令 s[i]=s[i−1]+1,否则令 s[i]=s[i−1]−1。否则,继续考虑下一个 r。原创 2023-02-14 08:46:12 · 389 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。原创 2023-02-12 10:42:43 · 505 阅读 · 1 评论 -
剑指 Offer 04. 二维数组中的查找
由于 (x,y)的初始值分别为(0,m−1),因此y最多能被减少m次,x最多能被增加n次,总搜索次数n+m。如果 matrix[x,y]>target,由于每一列的元素都是升序排列的,那么在当前的搜索矩阵中,所有位于第y 列的元素都是严格大于target的,因此我们可以将它们全部忽略,即将y减少1;如果 matrix[x,y]原创 2023-02-24 19:40:08 · 578 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
由于每次替换从1个字符变成3个字符,使用字符数组可方便地进行替换。建立字符数组地长度为 s 的长度的3倍,这样可保证字符数组可以容纳所有替换后的字符。空间复杂度:O(n)O(n)。额外创建字符数组,长度为 s 的长度的 3 倍。时间复杂度:O(n)O(n)。遍历字符串 s 一遍。原创 2023-02-24 19:49:03 · 593 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
【代码】剑指 Offer 06. 从尾到头打印链表。原创 2023-02-23 22:53:31 · 190 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。在「递归」地遍历某个子树的过程中,我们也是将这颗子树看成一颗全新的树,按照上述的顺序进行遍历。挖掘「前序遍历」和「中序遍历」的性质,我们就可以得出本题的做法。原创 2023-02-12 11:21:05 · 383 阅读 · 0 评论 -
剑指 Offer 08. 二叉树的下一个结点
如果给出的结点无右子节点,且当前结点是其父节点的右子节点,则先要沿着左上方父节点爬树,一直爬到当前结点是其父节点的左子节点为止,返回的就是这个父节点;根据给定输入中的结点指针向父级进行迭代,直到找到该树的根节点;然后根据根节点进行中序遍历,当遍历到和给定树节点相同的节点时,下一个节点就是我们的目标返回节点。step 3:判断该节点是否符合思路中第三点,则迭代向上找父节点,直到迭代的当前节点是父节点的左孩子节点为止,返回该父节点;如果给出的结点无右子节点,且当前结点是其父节点的左子节点,则返回其父节点。原创 2023-02-24 20:28:20 · 202 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
【代码】剑指 Offer 09. 用两个栈实现队列。原创 2023-02-23 23:18:25 · 103 阅读 · 0 评论 -
剑指 Offer 10- 斐波那契数列与青蛙跳台阶问题
【代码】剑指 Offer 10- I. 斐波那契数列与青蛙跳台阶问题。原创 2023-02-24 21:13:30 · 139 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
如下图所示,由于重复元素的存在,我们并不能确定numbers[pivot]究竟在最小值的左侧还是右侧,因此我们不能莽撞地忽略某一部分的元素。我们唯一可以知道的是,由于它们的值相同,所以无论 numbers[high]是不是最小值,都有一个它的替代品numbers[pivot],因此我们可以忽略二分查找区间的右端点。在二分查找的每一步中,左边界为low,右边界为high,区间的中点为pivot,最小值就在该区间内。我们考虑数组中的最后一个元素x:在最小值右侧的元素,它们的值一定都小于等于x;原创 2023-02-24 21:39:37 · 478 阅读 · 0 评论 -
剑指 Offer 12. 矩阵中的路径
空间复杂度 O(K): 搜索过程中的递归深度不超过K ,因此系统因函数调用累计使用的栈空间占用 O(K)(因为函数返回后,系统调用的栈空间会释放)。最坏情况下 K=MN,递归深度为MN ,此时系统栈使用 O(MN)的额外空间。时间复杂度 O((3^K)MN) : 最差情况下,需要遍历矩阵中长度为K字符串的所有方案,时间复杂度为 O(3K);返回false :(1) 行或列索引越界或(2) 当前矩阵元素与目标字符不同或(3) 当前矩阵元素已访问过 ((3) 可合并至 (2) )。原创 2023-02-24 23:19:46 · 541 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围
摘要摘要JZ13 机器人的运动范围(地上有一个 rows 行和 cols 列的方格。坐标从 [0,0] 到 [rows-1,cols-1]。一个机器人从坐标 [0,0] 的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于 threshold 的格子。例如,当 threshold 为 18 时,机器人能够进入方格 [35,37] ,因为 3+5+3+7 = 18。但是,它不能进入方格 [35,38] ,因为 3+5+3+8 = 19。原创 2023-03-02 21:34:51 · 364 阅读 · 0 评论 -
剑指 Offer 14-剪绳子
由于j的取值范围是1到i−1,需要遍历所有的j得到dp[i]的最大值,因此可以得到状态转移方程如下:dp[i]=max(1≤j原创 2023-03-01 22:14:17 · 315 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数。原创 2023-02-18 21:24:41 · 105 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
本题的方法被称为快速幂算法,有递归和迭代两个版本。这篇题解会从递归版本的开始讲起,再逐步引出迭代的版本。当指数n为负数时,我们可以计算 x^(-n)再取倒数得到结果,因此我们只需要考虑n为自然数的情况。原创 2023-03-02 20:46:57 · 320 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数
并且, String 类型的数字的进位操作效率较低,例如 "9999" 至 "10000" 需要从个位到千位循环判断,进位 4 次。观察可知,生成的列表实际上是 n位 0-9 的 全排列 ,因此可避开进位操作,通过递归生成数字的 String 列表。基于分治算法的思想,先固定高位,向低位递归,当个位已被固定时,添加数字的字符串。例如当n=2时(数字范围1−99 ),固定十位为0-9 ,按顺序依次开启递归,固定个位0- 9 ,终止递归并添加数字字符串。实际上,本题的主要考点是大数越界情况下的打印。原创 2023-03-02 21:06:37 · 238 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点
【代码】剑指 Offer 18. 删除链表的节点。原创 2023-03-03 14:09:43 · 96 阅读 · 0 评论