刷刷刷
领扣、牛客
程序员·小李
不知道要干什么的时候,停一停,想一想;知道想要什么的时候,努努力,拼一拼。
展开
-
剑指Offer系列:二叉搜索树的第k个节点
给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。1.返回第k小的节点值即可 2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1 3.保证n个节点的值不一样。所以,我们可采用中序遍历的方式,找到第k个遍历到的节点,就是第k小的节点。该二叉树所有节点按结点值升序排列后可得[2,3,4,5,6,7,8],所以第3个结点的结点值为4,故返回对应结点值为4的结点即可。数据范围:0≤n≤1000,0≤k≤1000,树上每个结点的值满足0≤val≤1000。原创 2023-01-11 23:46:15 · 381 阅读 · 0 评论 -
剑指Offer系列:按之字形顺序打印二叉树
其实是二叉树层序遍历的一种变形,需要考虑的是逆序打印的场景,可以借ArrayList的add(0, val)的方式实现,但是性能不高。给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)该二叉树之字形层序遍历的结果是 [[1], [3,2], [4,5]]2023/01/01 13:52:43 by: 程序员·小李。例如:给定的二叉树是{1,2,3,#,#,4,5}要求:空间复杂度:O(n),时间复杂度:O(n)原创 2023-01-11 23:44:03 · 118 阅读 · 0 评论 -
剑指Offer系列:二叉树的深度
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,根节点的深度视为 1。数据范围:节点的数量满足 0≤n≤100 ,节点上的值满足 0≤val≤100 进阶:空间复杂度 O(1),时间复杂度 O(n)2023/01/01 08:22:26 by: 程序员·小李。将每一条链路递归到,看一下最大值是多少。原创 2023-01-11 23:42:11 · 173 阅读 · 0 评论 -
剑指Offer系列:删除链表中重复的结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表 1->2->3->3->4->4->5 处理后为 1->2->5。使用辅助栈完成去重,当栈为空直接压栈,栈中存在元素时,通过peek方法判断是否重复,如果出现重复则直接找到下一个不重复的元素,同时修改上一个引用的指向。数据范围:链表长度满足 0≤n≤1000 ,链表中的值满足 1≤val≤1000。2022/12/31 23:15:41 by: 程序员·小李。原创 2023-01-11 23:39:57 · 118 阅读 · 0 评论 -
剑指Offer系列:复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)。图中实线箭头表示next指针,虚线箭头表示random指针。为简单起见,指向null的指针没有画出。两次遍历完成题目,第一次遍历复制值,并将新旧对象建立映射关系。第二次遍历,根据映射关系复制对象之间的指向关系。2022/12/31 22:27:14 by: 程序员·小李。原创 2023-01-11 23:37:46 · 94 阅读 · 0 评论 -
剑指Offer系列:两个链表的第一个公共结点
这里的解题思路特别巧妙,假如两个链表的长度分别为n和m,将两个链表均遍历一次,那么拼接起来的链表的长度为n+m,是等长的。如果有公共节点,那么组合后的链表后半部分一定是一致的。输入两个无环的单向链表,找出它们的第一个公共结点,如果没有公共节点则返回空。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)可以看到它们的第一个公共结点的结点值为6,所以返回结点值为6的结点。2022/12/31 20:53:50 by: 程序员·小李。原创 2023-01-11 23:33:23 · 358 阅读 · 0 评论 -
JZ14 剪绳子
给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且 m > 1 , m原创 2022-11-04 22:26:19 · 84 阅读 · 0 评论 -
JZ81 调整数组顺序使奇数位于偶数前面
输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对位置不做要求,但是时间复杂度和空间复杂度必须如下要求。数据范围:0≤n≤50000,数组中每个数的值 0≤val≤10000。[3,1,2,4]或者[3,1,4,2]也是正确答案。要求:时间复杂度 O(n),空间复杂度 O(1)原创 2022-11-04 22:12:21 · 85 阅读 · 0 评论 -
JZ17 打印从1到最大的n位数
题目示例实现:原创 2022-11-04 21:27:10 · 61 阅读 · 0 评论 -
【剑指】爬楼梯问题(斐波那契数列)
爬楼梯,一次可以选择一级楼梯或者二级楼梯,问,爬上n级楼梯共有多少种爬法?示例:n=3时,可以采用[1, 1, 1]或者[1, 2]或者[2, 1]的方式爬,共三种爬法。通过数学归纳法,其实可以发现这个问题是与斐波那契数列一致的。即:1,1,2,3,5,8,13,21······我们可以得到递归公式:n = 1时,result = 1n = 2时, result = 2n = 3时, result = f(1) + f(2)···n = k时,result...原创 2021-11-15 14:54:27 · 916 阅读 · 0 评论 -
【剑指】数组中的重复数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中重复的数字。原创 2022-08-31 00:25:47 · 125 阅读 · 0 评论 -
【剑指】 重建二叉树
1.在前序遍历中,找到根节点,即pre[0],初始化前序、中序遍历数组中数据的范围preStart,preEnd,inStart,inEnd。我们知道,前序遍历中第一个元素是根节点,因而,从preStart+1开始,持续len(L)个元素都是左子树,因此,我们可以确认范围。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。在中心遍历中,root前面的必定是左子树,root后面的必定是右子树。.........原创 2022-07-24 18:26:47 · 313 阅读 · 0 评论 -
11. 盛最多水的容器
假如存在i,0Math.min(a[0],a[size])显然是不成立的。我们假设a[0]原创 2022-07-14 23:43:18 · 136 阅读 · 0 评论 -
BM54 三数之和
给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。输入:[-10,0,10,20,-10,-40]返回值:[[-10,-10,20],[-10,0,10]]三个数的和,可以参考两数之和的思路,因为不涉及到索引,可以先排序。同时,双指针可以很快的解决两个数的和。所以采用控制变量法,每次先确定一个值,然后再采用双指针。当然,因为已经排序,所以去重的方法也显得很巧妙。复杂度O(N^2)...原创 2022-07-14 08:33:37 · 276 阅读 · 0 评论 -
JZ18 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。1.此题对比原题有改动2.题目保证链表中节点的值互不相同注意考虑删除节点为头结点的问题。...原创 2022-07-09 18:39:45 · 170 阅读 · 0 评论 -
JZ22 链表中倒数最后k个结点
输入一个长度为 n 的链表,设链表中的元素的值为 ai ,返回该链表中倒数第k个节点。如果该链表长度小于k,请返回一个长度为 0 的链表。依然采用快慢指针的方法,快指针先走K步,慢指针再走,快指针到末尾,慢指针指向倒数第K个...原创 2022-07-09 18:28:38 · 115 阅读 · 0 评论 -
剑指 Offer II 027. 回文链表
给定一个链表的 头节点 ,请判断其是否为回文链表。如果一个链表是回文,那么链表节点序列从前往后看和从后往前看是相同的。 1. 链表的翻转 2. 快慢指针找中心位置的“右臂”我们发现,这种方式下,存在奇数和偶数个元素的问题: 3. 微调,在停止时,如果fast == null 说明是偶数,fast != null说明是奇数,奇数个时前进一步。4. 翻转右半部分,依次比对,判断是否对称完整实现:......原创 2022-07-09 17:22:31 · 120 阅读 · 0 评论 -
BM26 求二叉树的层序遍历
给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历)例如:给定的二叉树是{3,9,20,#,#,15,7},该二叉树层序遍历的结果是[ [3], [9,20], [15,7] ] 借助于队列,依次按层入队,单层的处理借助于队列的size进行for循环处理,这样单层可以整合到同一个List中。...原创 2022-07-07 07:49:53 · 170 阅读 · 0 评论 -
【剑指】用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:示例 2:提示:1 .........原创 2022-07-04 23:37:04 · 62 阅读 · 0 评论 -
【剑指】 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1] 限制:0原创 2022-07-04 23:22:07 · 101 阅读 · 0 评论 -
【剑指】 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:限制:0原创 2022-07-04 23:10:56 · 76 阅读 · 0 评论 -
【算法】两数求和
2.如果对索引或者位置没有什么要求,可以先排序,让数列成为有序的,然后采用双指针的方法,当和比较大high--,和比较小low++,直到找到和为target的一对,复杂度O(nlogN)3.直接一遍遍历,借助于辅助空间记录数据,拿到数据后,直接看target-current有没有,复杂度O(N)1.首先想到的是暴力解法,两层循环,计算每一个值与其他值的和,与目标值对比一下,但是这种复杂度很高。这里有改造方案,如果是查询指定的元素,而不是索引,可以先进行排序,这样可以减小复杂度。...原创 2021-08-15 10:37:02 · 608 阅读 · 0 评论 -
BM23 二叉树的前序遍历
递归最好理解: 迭代版:其实也是模拟了递归的流程,按根、左、右的顺序依次添加。原创 2022-06-19 14:59:29 · 190 阅读 · 0 评论 -
BM95 分糖果问题
每个人至少一个。从左向右遍历一次,满足右侧的人。(类似于传声筒,从左向右遍历时,只关心是不是比自己左侧的高)从右向左遍历一次,满足左侧的人。(类似于传声筒,从右向左遍历时,只关心是不是比自己右侧的高)注:从右向左遍历时,需要注意左侧分得的糖果已经比右侧大的可能性。...原创 2022-06-19 11:00:07 · 997 阅读 · 0 评论 -
BM22 比较版本号
拆分成多个步骤,其实就是比较按“.”分组后的数字的大小,前置0视为没有,直接Integer.parseInt可以忽略前置0,当然,也可以逐字符比较。原创 2022-06-19 10:03:42 · 253 阅读 · 0 评论 -
BM19 寻找峰值
注:直接判断nums[i] > nums[i-1] && nums[i] > nums[i+1]可能会漏掉只有一个或两个的情形。原创 2022-06-19 08:54:54 · 153 阅读 · 0 评论 -
【剑指】二维数组中的查找
这个矩阵有这样的特征: 左下角和右上角相对于左上角和右下角具备优势,因为一个方向增大,一个方向减小,可以逐步移动。右上角搜索:左下角搜索:原创 2022-06-19 00:15:41 · 146 阅读 · 0 评论 -
BM17 二分查找-I
最基础的二分查找法,注意使用low + (high - low) / 2,防止加法溢出:原创 2022-06-18 23:58:10 · 104 阅读 · 0 评论 -
哈希算法与哈希冲突
哈希算法哈希算法为了是快速读写指定位置的数据,类似于字典索引的策略,通过哈希函数的计算,将某一指定的数据存储到指定的位置,为的是快速定位数据的存储位置。常见的哈希函数有:除法哈希算法、乘法哈希算法、平方取中法、随机数哈希算法。除法哈希算法计算方式:h(x) = x % m这里的x就是待存储数据的键值,m往往选择为存储空间的个数,直接取余计算存储位置。例如,我们在7个位置中存储3,11,8,6这几个数字根据计算,3 % 7 = 3, 11 % 7 = 4, 8 % 7 = 1,原创 2022-04-23 17:59:06 · 778 阅读 · 0 评论 -
删除链表倒数第N个元素
通过快慢指针,找到倒数第N-1个元素通过定义快慢指针,快指针先行N步,慢指针和快指针一起前进,快指针到达链表的尾部时,慢指针指向倒数第N-1个元素定义数据结构class ListNode:def __init__(self, val): self.val = val self.next = None头指针解决删除第一个元素的问题def removeNth(self, head, n): tmp = ListNode(0) tmp.原创 2022-04-22 22:57:13 · 616 阅读 · 0 评论 -
【0口】K个一组翻转链表
描述将给出的链表中的节点每 k个一组翻转,返回翻转后的链表如果链表中的节点数不是 k 的倍数,将最后剩下的节点保持原样示例给定的链表是 1→2→3→4→5对于 k = 2 , 你应该返回 2→1→4→3→5对于 k = 3 , 你应该返回 3→2→1→4→5分析我们前面实现过从m到n节点的翻转翻转m到n范围的链表https://blog.csdn.net/Day_and_Night_2017/article/details/123888377?spm=1001.2.原创 2022-04-13 08:28:04 · 104 阅读 · 0 评论 -
【动态规划】利润最大化问题
怎么样安排,挖出的黄金最多呢?这里有两个维度的东西,一个是收益,分别是200kg, 300kg, 350kg, 400kg, 500kg一个是成本,分别是3人,4人,3人,5人,5人可能乍一看,我们会采用贪心算法首先,计算他们的性价比,200/3,300/4,350/3,400/5,500/5。然后优先选择性价比较大的。会导致局部最优解,而非全局最优解。我们拿出某个黄金来说,只有两个选择,那就是挖或者不挖。1. 如果不挖,简化为在剩余4个金山中进行选择。原创 2022-04-05 10:27:48 · 1895 阅读 · 0 评论 -
【漫画算法】无需数组排序后的最大相邻元素差
问题描述有一个无序整型数组, 如何求出该数组排序后的任意两个相邻元素的最大差值? 要求时间和空间复杂度尽可能低。示例输入:2,6,3,4,5,10,91. 先找到最小值与最大值2. 以最小值为基准,建max - min个桶,并进行映射,在有值的位置填入1这里的映射规则是,index = (i - min), 例如,2的索引是2-2=06的索引是6-2 = 4以此类推。3. 找到间断的1之间的最大空隙即结果7-4 = 3...原创 2022-04-04 21:24:45 · 86 阅读 · 0 评论 -
【漫画算法】字典顺序的下一个
对于1234这四个数字组成的数,可以有以下排列:1234,1243,1324,1342,1423,1432,2134···我们给定一个排列,找到下一个紧挨着的较大的数组排列。解法:我们先找到逆序的边界,例如12354中,54组成逆序的边界,将逆序区域中大于3最小的值,与逆序区域前紧挨着的数字3交换位置但是我们发现,12453并不是最小的值,应该把5和3交换一下位置,消除逆序。这样就得到了我们想要的数字。代码实现public int[] fi.原创 2022-04-04 21:13:50 · 196 阅读 · 0 评论 -
【漫画算法】删除k个数字后最小
问题描述给出一个整数, 从该整数中去掉k个数字, 要求剩下的数字形成的新整数尽可能小。 应该如何选取被去掉的数字?分析为了剩下的数字组成的数尽可能小,我们应对尽可能在高位进行删减。不同的顺序对数字的影响不同:12345,13245我们删掉1和删掉3,得到的结果是2345,1245显然后者会更小。产生逆序的位置的数字删减,对源数据的大小影响更大。示例541 270 936 删减3个数字,使得结果最小。第一次,删掉5.此处为什么删除5?为什么不是原创 2022-04-04 19:54:59 · 363 阅读 · 0 评论 -
【漫画算法】大数计算
出现长度过大的大数计算时,怎么完成相关的加减乘除操作呢?1. 将两个操作数按分位拆分到数组中。此处采用的是低位在低索引的方式存储。2. 从低位开始依次计算各个分位上的数值,注意进位8+9的进位存储在了十分位的结果上,计算十分位时,将其包含在内。最终的结果注意,为什么在计算的时候,被加数12位,加数11位,而结果和存储的位置使用13位呢?那是为了防止产生进位。...原创 2022-04-04 19:26:19 · 91 阅读 · 0 评论 -
【漫画算法】数据缺失问题
描述在指定1-100范围内的数组中,现在一个99个不重复的数据,缺失一个数据,怎么找到这个缺失的值?解法1:建立HashMap,在遍历的同时将数据写入到HashMap中,建立数据映射,最后判断缺少哪个数据。解法2:计算1-100的和,遍历99个已经存在的数,依次从和中减掉已经遍历到的值,剩下的就是不存在的数。扩展1一个无序数组里有若干个正整数, 范围是1~ 100, 其中99个整数都出现了偶数次, 只有1个整数出现了奇数次, 如何找到这个出现奇数次的整数?原创 2022-04-04 19:17:18 · 207 阅读 · 0 评论 -
【漫画算法】2的整数次幂的特性
仅最高位是1,其余位是0.为啥呢?想想十进制的问题,十进制逢十进一,那么二进制逢二进一。在十进制中,10,100,1000,10000,整十,整百,整千,整万都是最高位是1,其余各位是0二进制中,2,4,8,16,32,64,最高位也是1,其余各位是0n-1最高位为0,其余位为1为啥呢? 想想十进制的问题,十进制逢十进一,那么二进制逢二进一。在十进制中,10,100,1000,10000,整十,整百,整千,整万减一,变成9,99,999,9999二进制中,2(10B)..原创 2022-04-04 11:28:37 · 336 阅读 · 0 评论 -
关于正整数的最大公约数计算
解法1:欧几里得定理:两个正整数a和b( a>b) , 它们的最大公约数等于a除以b的余数c和b之间的最大公约数public int getGreatestCommonDivisorV2(int a, int b){ int big = a>b ? a:b; int small = a<b ? a:b; if(big % small == 0){ return small; } return getGrea原创 2022-04-04 11:13:20 · 267 阅读 · 0 评论 -
【漫画算法】找到链表环的入口
描述我们采用快慢指针可以判断链表是否有环,判断链表有环https://everspringlee.blog.csdn.net/article/details/122442179也能够根据快慢指针的行进速度加上追及问题判断环的长度,判断链表中环的长度https://everspringlee.blog.csdn.net/article/details/123949229那么怎么找到环的入口呢?分析还是原来的追及问题:两个人绕环形跑道跑步,环形跑道长300米,小明速原创 2022-04-04 10:42:46 · 177 阅读 · 0 评论