![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
萝卜丝皮尔
统计学、管理科学与工程
展开
-
【LeetCode 31】下一个排列,next permutation
大于该字典序值的字典序所对应的那种排列。注,如果给定数组拥有字典序最大,那么返回字典序最小的排列。比如:数组[1,2,3] 的下一个排列为[2,1,3];给定一个数组,其中元素的排列对应着一个字典序值,找。数组[1,1,5] 的下一个排列为[1,5,1];原创 2024-04-14 17:33:11 · 399 阅读 · 0 评论 -
【LeetCode 560】和为k的子数组 && 数组三连问题
给定一个数组和值k,求数组中有多少个子数组,满足和等于值k。原创 2024-04-14 15:18:46 · 370 阅读 · 0 评论 -
【leetcode 5】最长回文子串, Manachers算法
caccaac。原创 2024-04-08 17:41:53 · 304 阅读 · 0 评论 -
【Leetcode 32】最长有效括号,动态规划
【代码】【Leetcode 32】最长有效括号,动态规划。原创 2024-04-07 20:38:14 · 100 阅读 · 0 评论 -
【LeetCode 139】单词拆分,动态规划
【代码】【LeetCode 139】单词拆分,动态规划。原创 2024-04-07 16:04:30 · 167 阅读 · 0 评论 -
【leetcode279】完全平方数,动态规划解法
此时,如果把这些完全平方数视作可获得的硬币面值,把n视作待兑换零钱的总数,那么问题就是求“最少需要多少种硬币,能够把n换成零钱?如果兑换不成功,那么返回-1.”)原问题:给定一个非负整数n,如果把它视作一些完全平方数的和,那么最少需要多少个完全平方数?这次学习到一个热心网友的解法:把问题转化兑换零钱问题,然后使用动态规划求解。比如,给定 n=12, 那么我们可以列举出可能的完全平方数。原创 2024-04-06 22:08:45 · 187 阅读 · 0 评论 -
【Leetcode 347】,前k个高频元素,小根堆的调整
下面使用数组‘heap’,函数’shift_down’,函数‘shift_up’等实现小根堆及其调整(上浮、下沉)。遍历数组,建立小根堆(小根堆的元素是元组(num,freq),排序规则是每个元素的频率)。题目:给定一个数组,输出 前k个高频元素。原创 2024-04-05 20:53:56 · 313 阅读 · 1 评论 -
遍历二叉树的Morris序
中序遍历序列就是第二次访问(附注:如果一个节点只被访问一次,那么第一次访问时直接打印)的顺序:4,2,5,1,6,3,7。对于上图的二叉树来说,Morris序就是 cur访问过的顺序:1,2,4,2,5,1,3,6,3,7.前序遍历序列就是第一次访问的顺序:1,2,4,5,3,6,7。第二次恢复现场时,cur=①,逆向打印其左树的右边界:5,2;第一次恢复现场时,cur=②,逆向打印其左树的右边界:4;所以,整个后序遍历序列是 4,5,2,6,7,3,1.最后,逆序打印整个树的右边界:7,3,1;原创 2023-12-24 11:28:50 · 192 阅读 · 0 评论 -
《漫画算法》笔记——给定数,求删除k个数字后的最小值
【代码】《漫画算法》笔记——给定数,求删除k个数字后的最小值。原创 2023-12-21 22:33:35 · 188 阅读 · 0 评论 -
《漫画算法》笔记——内存管理算法LRU
【代码】《漫画算法》笔记——内存管理算法LRU。原创 2023-12-21 21:17:32 · 205 阅读 · 0 评论 -
《漫画算法》笔记——计算两个大数的和
输入:“123”,“234”原创 2023-12-21 20:50:22 · 99 阅读 · 0 评论 -
【《漫画算法》笔记】找数组中出现奇数次的元素
在上述的基础上,同样对所有元素做异或运算,那么结果必然不是0。也就是说,异或的结果存在某一位非0,假设第a位。这提醒我们,可以根据这个非零位对给定数组中的元素进行分类——分成两类。第一类,二进制表示第a位上为0的元素;第二类,二进制表示第a位上为1的元素。考虑到异或运算的性质——两个等值数的异或结果等于0,两个不等值的数异或结果为1,将给定数组的所有元素异或起来,最终结果就是那个“唯一出现过计数次”的数。原创 2023-12-18 22:36:36 · 130 阅读 · 0 评论 -
【《漫画算法》笔记】位图算法
内存中连续的二进制位所组成的数据结构,该算法主要用于大量整数的去重和查询”。原创 2023-12-18 22:02:53 · 156 阅读 · 0 评论 -
【《漫画算法》笔记】快速排序
函数本身是对的,见下面的“单边循环”递归版快速排序的代码。开始,也不行,这仍然会造成无限循环,我目前还在找原因)注:这个地方有一个很tricky的点是,(即便是把for循环修正到从。使用集合栈代替递归的函数栈。原创 2023-12-15 20:38:20 · 59 阅读 · 0 评论 -
剑指offer !! 68.二叉树的最近公共祖先
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3。示例 2:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4输出:5。原创 2023-08-13 15:11:13 · 86 阅读 · 0 评论 -
剑指 Offer !67. 把字符串转换成整数
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。原创 2023-08-13 10:44:47 · 114 阅读 · 0 评论 -
剑指 Offer !63. 股票的最大利润
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5。第一种是我自己的第一想法,写得很啰嗦,时间复杂度、空间复杂度都是O(n),所以有很大的优化空间;假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?值得注意的点是:买入股票最晚是卖出股票当天,也就是,要先买入再卖出。解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。输入: [7,1,5,3,6,4]输入: [7,6,4,3,1]原创 2023-08-10 23:47:43 · 81 阅读 · 0 评论 -
剑指 Offer !!62. 圆圈中最后剩下的数字(约瑟夫环问题)
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。这个题解的缺点在于,推导过程有些粗糙……从一个案例直接退出递推公式。左程云的书(《程序员代码面试指南》第2版)上有一个还算规范的推导。输入: n = 10, m = 17。输入: n = 5, m = 3。原创 2023-08-10 23:36:51 · 298 阅读 · 0 评论 -
剑指 Offer ! 61. 扑克牌中的顺子
参考资料:力扣K神的讲解剑指 Offer 61. 扑克牌中的顺子简单351相关企业从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。原创 2023-08-10 21:31:50 · 685 阅读 · 0 评论 -
剑指 Offer !!! 60. n个骰子的点数
考虑到上述二维的动态规划表dp[i][j]仅依赖于上一行dp[i-1][…], 可以做压缩, 也就是把使用两个数组交替着完成二维表dp的更新,直到更新出dp表的最后一行.你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。输出: [0.16667,0.16667,0.16667,0.16667,0.16667,0.16667]输入n,打印出s的所有可能的值出现的概率。下面的代码参考了力扣K神的代码,只是为了便于理解,我做了小小的改动,也就是。原创 2023-08-09 19:43:27 · 132 阅读 · 0 评论 -
!!剑指 Offer 59 - I. 滑动窗口的最大值
剑指 Offer 59 - I. 滑动窗口的最大值困难632相关企业给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值提示:你可以假设 k 总是有效的,在输入数组 不为空 的情况下,1 ≤ k ≤ nums.length。原创 2023-08-09 11:21:58 · 175 阅读 · 0 评论 -
剑指 Offer !!57 - II. 和为s的连续正数序列
剑指 Offer 57 - II. 和为s的连续正数序列输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]原创 2023-08-05 23:32:19 · 151 阅读 · 0 评论 -
剑指 Offer !!56 - II. 数组中数字出现的次数 II
然后,对k取余数(注意考虑到“先求和再取余,等于,先取余再求和”,代码中这部分是一边求和一边取余),这一步之后那些“出现k次”的数在eo中必然没有留下痕迹,也就是说eo是我们要找那个“只出现一次”的数的k进制表示;,他们的痕迹必然消失,所以此后count[i]就是那个“只出现一次”的数的二进制表示的第i位);,(思考一下,此时那些出现k次的数的二进制表示的第i位,加和到counts[i]中,经过这次。问:这个“出现一次”的数是谁?思路和上面相差不大,这里是把数组中每一个数转成k进制,每一位加和得到eo,原创 2023-08-04 21:49:46 · 242 阅读 · 0 评论 -
剑指 Offer 55 - II. ! 平衡二叉树
来自力扣K神的解法2,一种比较自然的思路,首先算左树右树的深度,判断当前树是否满足“左子树深度与右子树深度相差不得超过1”的条件,然后判断左树右树是否是平衡树,对这三个boolean取&&,得到的结果即当前树是不是平衡树。输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。使用-1标记“这个树不平衡”,而如果树是平衡的,那么可以直接返回树的高度。下面的解法参考了左程云算法课上所介绍的关于二叉树题目的套路。原创 2023-08-02 20:07:46 · 173 阅读 · 0 评论 -
剑指 Offer 54. ! 二叉搜索树的第k大节点 (考察二叉树的中序遍历)
我的思路是:用一个全局arrayList不断收集“逆向”中序遍历该搜索二叉树所需要的答案。使用全局变量,一遍遍历一遍数,数到第k个最大的数时就返回。给定一棵二叉搜索树,请找出其中第 k 大的节点的值。剑指 Offer 54. 二叉搜索树的第k大节点。原创 2023-08-02 17:25:44 · 146 阅读 · 0 评论 -
剑指 Offer 53 - I. !!在排序数组中查找数字 I (考查二分法)
这个我还在学习,比如while循环条件要不要等号,循环内部left是等于mid,还是mid+1,等等;首先,沿用解法一:首先找到“=target区”的右边界(开的,表示这个边界所指的元素不是target);我觉得难点不是想到用二分法(题目中指明给定有序数组就是明显地暗示:可以使用二分法);输入: nums = [5,7,7,8,8,10], target = 8。输入: nums = [5,7,7,8,8,10], target = 6。统计一个数字在排序数组中出现的次数。我日后来补补二分法专项……原创 2023-08-02 17:17:11 · 257 阅读 · 0 评论 -
剑指 Offer 51.!!! 数组中的逆序对 (归并排序算法)
在“并”时,只有右指针所指的元素[r] 小于 左指针所指的元素[l]时,才会有逆序对(在当前合并轮种,右指针所指的元素[r]能产生(mid-l+1)个逆序对),才会计数count(一个全局变量,计算有多少对逆序对)。在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。思路:套用归并排序的递归写法,需要注意的是。剑指 Offer 51. 数组中的逆序对。0 <= 数组长度 <= 50000。输入: [7,5,6,4]原创 2023-08-02 09:29:14 · 101 阅读 · 0 评论 -
剑指 Offer 49. !!丑数 (找数学规律)
质因子是2,3,5。所以,丑数必然是有这三个数若干次相乘得到。而丑数序列保持从小到大,所以当前的丑数必然是前面某个丑数乘2或者3或者5得到的。原创 2023-07-30 14:29:55 · 111 阅读 · 0 评论 -
剑指 Offer 46.! 把数字翻译成字符串(动态规划,青蛙跳台问题的变形)
空间压缩后的动态规划,原因是考虑到计算dp[i]时只使用到dp[i-1],dp[i-2]。也可以跳两层,对应:(在满足一定条件下)翻译两个数字到字符。下面是参考过大佬们的解题思路后,自己写的动态规划解法。下面是我自己的思路,这应该算是深度优先搜索了……没有对比就没有伤害,我佩服大佬们的思路。可以跳一层,对应:翻译一个数字到字符;这其实可看作经典的青蛙跳台问题,原创 2023-07-30 11:51:09 · 194 阅读 · 0 评论 -
剑指 Offer 45. !!把数组排成最小的数(使用比较器的定制排序;快速排序)
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。这道题在左程云算法课上讲过,但是这次做却完全没有印象了,只能大概想到需要排序。重点是:比较器的定义,这里使用lambda函数。注意快速排序算法的分析要区分理想情况和最坏情况。剑指 Offer 45. 把数组排成最小的数。输入: [3,30,34,5,9]输出: “3033459”方法二:自己写一个快速排序。方法一:使用内置排序函数。输入: [10,2]原创 2023-07-30 10:22:33 · 238 阅读 · 0 评论 -
剑指 Offer 44.!! 数字序列中某一位的数字
就是数数,边数边删(见下面代码的while循环),直到最后落在某个区间,这就能确定目标所在的位置是 几位数的群体(即退出while循环后的digit, 如果digit=2,那么说明落在10-99之间),…在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。进一步,定位是这个数字的哪一位(见最后的return语句。比如,第一位,即7)。注意:从0开始数,也就是0就是第0位,1就是第1位。剑指 Offer 44. 数字序列中某一位的数字。请写一个函数,求任意第n位对应的数字。原创 2023-07-29 20:35:00 · 177 阅读 · 0 评论 -
剑指Offer 43. !! 1~n 整数中 1 出现的次数
链接:https://leetcode.cn/problems/1nzheng-shu-zhong-1chu-xian-de-ci-shu-lcof/solutions/934769/1n-zheng-shu-zhong-1-chu-xian-de-ci-shu-umaj8/例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。以百位为例(k=2),将[1,2,3…,n]的数在百位上的’1’的个数。原创 2023-07-29 18:08:36 · 158 阅读 · 0 评论 -
剑指Offer! 38.字符串的排列,深度优先遍历
比如上面的"abscajoaka",pivot='b’时,chs[7]=‘a’,由于他们之间存在和chs[7]相同的字符chs[4],那么chs[4]必然在chs[7]与pivot发生交换之前与pivot交换,所以chs[7]与pivot会产生重复的分支,于是剪枝去重。如"abscajoaka"第一个’a’作pivot时,欲固定位置0上的字符,pivot可以和它之后的任意字符chs[i](包含它本身)做替换生成新的字符串,在此基础上分析位置1处的字符’b’为pivot时的情况(欲固定位置1上的字符)。原创 2023-07-21 08:28:03 · 81 阅读 · 0 评论 -
剑指 Offer !37. 序列化二叉树(二叉树的广度优先遍历)
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。在下面的序列化、反序列化函数中,为了保持一致性,规定:只有当结点不为null时,才允许进入队列queue。请实现两个函数,分别用来序列化和反序列化二叉树。原创 2023-06-30 10:52:47 · 264 阅读 · 0 评论 -
剑指 Offer ! ! 36. 二叉搜索树与双向链表
剑指 Offer 36. 二叉搜索树与双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。为了让您更好地理解问题,以下面的二叉搜索树为例:思路:考虑到二叉搜索树的性质“左树上的结点值小于根节点值,根节点值小于右树上的结点值”,对给定二叉树搜索树做中序遍历即可,期间将“打印操作”(一般的中序遍历二叉树流程中的“打印操作”)换成左右指针的连接操作。原创 2023-06-30 09:07:45 · 184 阅读 · 0 评论 -
剑指 Offer ! ! 34. 二叉树中和为某一值的路径
提交显示,已经通过了110/114个 输入 [5,4,8,11,null,13,4,7,2,null,null,5,1] 22 输出 [[5,4,11,2],[5,4,8,4,5]] 预期结果 [[5,4,11,2],[5,8,4,5]] 我不明白,为什么第二个子解,‘4’没有从path里删除……输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22。输出:[[5,4,11,2],[5,8,4,5]]叶子节点 是指没有子节点的节点。原创 2023-06-28 06:32:50 · 63 阅读 · 0 评论 -
剑指 Offer !!33. 二叉搜索树的后序遍历序列
考虑到“如果是搜索二叉树,那么左树上的结点值小于根节点值,右树上的结点值大于根节点值”,在数组中找第一个大于根结点值的数,该数的左边是左树,该树的右边是右树;输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。下面代码的巧妙之处在于:用变量p去遍历数组找到第一个大于根节点值的元素后,记录到变量m中;结合递归函数的base case,这样的安排很好地避免了左右树是否为空的讨论(我试过,讨论得一塌糊涂……输入: [1,6,3,2,5]输入: [1,3,2,6,5]序列的最后一个数是根节点,原创 2023-06-27 19:56:56 · 91 阅读 · 0 评论 -
剑指 Offer !! 32 - II. 从上到下打印二叉树 II &&LeetCode102---------树的广度优先遍历
下面的代码是LeetCode大佬写的,巧妙之处在于:用于弹出、记录本层元素的for循环的变量i从高到低取值,如此一来,不必担心在for循环中删除、添加会更改。相比于简单的按层遍历二叉树,这道题的关键在于 如何记录一层的开始和结尾 或者 一层有多少个元素。第一种是记录每一层有多少个元素,while循环一次批量打印一层的元素(见下面代码);从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。给定二叉树: [3,9,20,null,null,15,7],(即 当前层的元素个数)。原创 2023-06-24 21:40:54 · 274 阅读 · 0 评论 -
剑指 Offer 03. 数组中重复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。上面的解法是 边恢复数组,边检查是否有重复值,所以只需要遍历一遍数组;,如此一来,取值在0~n-1上的 n个数的取值 可以做到 不重复。下面的解法是 先恢复数组,再检查是否有重复,所以遍历了两遍数组。参考资料:《剑指Offer》,LeetCode评论区。剑指 Offer 03. 数组中重复的数字。找出数组中重复的数字。原创 2023-06-18 21:13:57 · 42 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )的时候,才能把 原始栈stack1 中的东西依次倒进 stack2, 而且必须是。输出:[null,-1,null,null,5,2]输出:[null,null,3,-1,-1]剑指 Offer 09. 用两个栈实现队列。原创 2023-06-17 22:19:21 · 322 阅读 · 0 评论