算法
文章平均质量分 51
算法
优惠券已抵扣
余额抵扣
还需支付
¥9.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
坠金
记性很差,写博客一是记录,二是交流分享,欢迎批评
展开
-
leetcode刷题:区间删除
小美拿到了一个大小为n的数组,她希望删除一个区间后,使得剩余所有元素的乘积末尾至少有k个 0。小美想知道,一共有多少种不同的删除方案?第一行输入两个正整数n,k。第二行输入n个正整数ai,代表小美拿到的数组。一个整数,代表删除的方案数。原创 2024-03-09 12:25:58 · 544 阅读 · 0 评论 -
差分数组leetcode 2770 数组的最大美丽值
差分数组是一种数据结构,它存储的是一个数组每个相邻元素的差值。换句话说,给定一个数组arr[],其对应的差分数组diff[]原创 2023-09-16 20:32:11 · 174 阅读 · 0 评论 -
python属性,方法
实例属性:以 self 为前缀的属性: 所有类对象共有的属性。原创 2023-06-24 14:23:33 · 66 阅读 · 0 评论 -
二叉树概念(三)(生成树算法)
求保持图连通的最少的边求最小生成树的方法有prim, krukal算法,二者都是贪心算法。原创 2023-06-10 23:46:58 · 56 阅读 · 0 评论 -
二叉树概念(二)
在 Python 中,没有内置的库可以用来模拟平衡二叉树。为了解决这个问题提出了红黑树,自然我们会问,如果只是追求平衡,那用平衡二叉树AVL就可以了,那AVL和红黑树的异同是什么?二叉搜索树的平均查找时间复杂度是O(logN), 然而在下面这种情况中(不平衡二叉搜索树)会恶化到O(N)同:红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O(log2N )叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置。小根堆:一棵完全二叉树,满足任一节点都比其他孩子节点小。原创 2023-06-10 23:38:53 · 593 阅读 · 0 评论 -
工厂模式
包括简单工厂,工厂方法,抽象工厂。原创 2023-04-27 13:17:22 · 494 阅读 · 0 评论 -
位运算
相同整数异或,结果为0。任意整数跟0异或,结果为本身。原创 2023-04-22 11:53:49 · 63 阅读 · 0 评论 -
滑动窗口
一般在找最长子**,最短子**,并且感觉用dp还差点意思时使用。原创 2023-04-22 11:52:12 · 59 阅读 · 0 评论 -
leetcode算法题python加速的技巧
使用装饰器@cache,会对计算过的内容进行缓存,本质类似于帮你自动dp了。原创 2023-04-21 11:58:31 · 60 阅读 · 0 评论 -
图论:以二维数组表示的连通图/树应如何表示?leetcode1042.不邻接种花
在这道题中输入类似[[1, 2], [3, 4]] ,这意味着花园1连通了花园2,花园3连通了花园4。那么该怎么根据这个输入,获取一个方便后面算法的表示呢?假如题目给的是一颗二叉树,要求相邻节点颜色不同,那我们可以用回溯解决。但使用哈希表或者二维数组作为容器,该怎么解决这题?难点是如何从颜色1-4中,排除连接的节点的值,还有如何从剩下的值中取一个。对于每个节点,先看一下与它连接的节点取了哪些值,然后从剩下的值中取一个。这个方法相比模拟更慢。原创 2023-04-15 11:21:51 · 80 阅读 · 0 评论 -
前缀和:leetcode2602数组元素全部相等的最少操作次数
这里有一个易错点,前缀和如果表示的是前i个数的和,那么前缀和数组长度为n+1,如果表示的是到第i个数的和,则数组长度为n,这两种情况推出的公式不同,我建议前缀和一律按前者处理,这也符合上图的公式。因为需要求和,所以在二重循环中运算。看到求和,就要马上想到前缀和,更进一步的,我们应该如何用前缀和加速求解?每一轮query中,都直接计算nums[i]和quries[i]的差值之和。上文求差,求的就是图中阴影面积。原创 2023-04-11 11:34:14 · 79 阅读 · 0 评论 -
leetcode1040移动石子
中等题长期的top1, 并不考察算法或者数据结构, 纯纯折磨, 可以不看明确题意,只能移动端点,且移动后不可仍旧为端点。原创 2023-04-07 16:34:46 · 307 阅读 · 0 评论 -
哈希-深入理解
哈希函数将键转换为一个索引值,然后将该索引值作为数组的下标,将对应的值存储在该位置中。当进行查找操作时,哈希表根据键计算出对应的索引值,然后直接访问该位置,即可获取对应的值。由于哈希函数是高效的,所以可以在常数时间内计算出索引值,从而实现快速的查找操作。哈希表和有序集合之所以写入慢,主要是因为它们的写入操作需要进行哈希函数计算、内存分配、冲突解决等操作,这些操作都需要消耗一定的时间和资源。特别是在哈希表中,如果哈希函数计算出的键值冲突较多,就需要进行链式存储或者扩容等操作,会导致写入操作变慢。原创 2023-03-23 21:48:15 · 58 阅读 · 0 评论 -
前缀和总结
也就是说,sum[l, r]等于前缀和数组中r+1的值减去前缀和数组中l的值。这个公式的思想是,先计算区间右端点之前的所有元素的和s[r],再减去区间左端点之前的所有元素的和s[l-1],这样就可以得到区间[l, r]的和。通过预处理前缀和数组,我们可以在O(1)的时间复杂度内计算任意区间的和,这在某些问题中非常有用,例如区间最大子段和问题、区间和的最大值/最小值等。前缀和是一个常用的算法技巧,通常用于求解数组或序列的区间和。原创 2023-03-11 11:34:35 · 350 阅读 · 0 评论 -
dp中的循环顺序问题-以回文子串为例
动态方程被dp[i - 1][j - 1]或dp[i][j - 1]或dp[i - 1][j - 1]决定,因此要先算出i - 1, j - 1方向的dp,所以循环顺序就是由上至下,由左至右。因此,当动态方程被dp[i +1][j - 1] 决定时,因此要先算出i + 1, j - 1方向的dp,遍历方向应该是从下到上,从左到右。回文子串是dp中的经典题目之一,当然这题也有中心扩展法可以解决,但是我想借这道题说明一下dp的循环顺序。多数的dp循环顺序就是由上至下,由左至右,这是由动态方程的逻辑决定的。原创 2023-03-09 12:44:27 · 127 阅读 · 0 评论 -
dfs+记忆化
由于回溯过程中会产生大量的重复计算,需要通过记忆化数组来记录在某个状态下(s字符位置和t字符位置)的值来简化计算。我个人理解,其实直接动态规划就行以leetcode115为例。原创 2023-03-03 14:45:21 · 104 阅读 · 0 评论 -
动态规划dp中的子序列、子数组问题总结
这类问题的共性是会提供两个数组,寻找他们共同的子序列、子数组。设第一个数组为s,第二个数组为t。则可以设二维dp数组,其大小为len(s + 1)*len(t + 1)dp[i][j]表示 s 前 i 个长度,与 t 前 j 个长度进行比较。原创 2023-03-02 12:57:45 · 87 阅读 · 0 评论 -
动态规划dp背包问题
拿到背包问题,最重要的是会归类到哪一种背包问题中,常见的考题里主要是01背包和完全背包,leetcode上连多重背包的题目都没有。问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);对0-1背包,常用二维dp数组:dp[i][j]表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。原创 2023-02-27 22:19:28 · 275 阅读 · 0 评论 -
dp中的循环顺序问题:背包问题中内外循环应该放背包or物品?
因为,如果把遍历nums(物品)放在外循环,遍历target的作为内循环的话,因为nums遍历放在外层,3只能出现在1后面,则计算dp[4]的时候,结果集只有 {1,3} 这样的集合,不会有{3,1}这样的集合。被视作不同的组合,其实这求的是排列数。组合总和 Ⅳ虽然名字叫组合,但是。原创 2023-02-27 21:59:48 · 116 阅读 · 0 评论 -
从leetcode518学习动态规划的完全背包问题
以输入[1,2,5], amount=5为例,可以看到下图中出现节点重复计算的情况,而这也是dfs暴力枚举超时的原因。带备忘录的递归是自顶向下,而动态规划是自底向上。原创 2023-02-27 19:50:06 · 64 阅读 · 0 评论 -
动态规划DP的概念与总结
Dynamic Programming,简称DP。解题关键是dp方程的确定。原创 2023-02-22 10:24:38 · 400 阅读 · 0 评论 -
贪心原理及刷题
按照右边界排序,将重叠的去掉,比如保留1,然后去掉2,3,下一个与1无重叠的是4,然后去掉5,....而dp这一步的局部最优,不一定来源上一步的局部最优,而可能与更早的解有关,同时dp转移方程的推导也比较复杂。合并区间,因为要取并集,因此对左边界排序,凡是左边界在范围内的,都可以取并集,然后扩展右边界。区间问题是贪心中常见的问题,需要根据区间的左边界或者右边界进行排序,然后根据区间进行操作。使用贪心需要满足,上一步的局部最优解能推出这一步的局部最优解,直到得到全局最优解。这道题是典型的贪心比dp好用的。原创 2023-02-20 14:31:52 · 347 阅读 · 0 评论 -
动态规划和贪心算法的区别
动态规划和贪心算法都是一种递推算法。均有局部最优解来推导全局最优解。原创 2023-02-19 10:38:28 · 348 阅读 · 0 评论 -
系统堆、栈与数据结构堆、栈的区别
在里有这么一句话:“在计算空间复杂度的时候我都把系统栈(不是数据结构里的栈)所占空间算进去。我就产生了疑问: 系统堆、栈与数据结构堆、栈的区别是什么?原创 2023-02-17 09:51:41 · 287 阅读 · 0 评论 -
为什么说回溯是暴力枚举
回溯的本质是循环的嵌套原创 2023-01-29 13:02:50 · 71 阅读 · 0 评论 -
C++ while(++i)和while(i++)
请注意,无论是while(++i), while(i++), 首次进入循环,输出的都是-1。while(++i)偱环i次;while(i++)循环i+1次。如果希望循环第一次输入的 i = - 2, 应该写成下面这样。++i 先对i自加,后再执行。i++ 先执行,后自加。原创 2023-01-27 09:56:44 · 656 阅读 · 0 评论 -
回溯概念及题目
输入元素是否重复能否重复使用某一元素ABC46 全排列✔✔39 求和✔✔40 求和✔✔(78)子集✔✔✔(90)子集✔✔✔✔47 全排列✔✔✔A: used[i]B: startC: 排序+ nums[i]==nums[i-1] &&!used[i-1]回溯是递归的副产品,只要有递归就会有回溯。回溯法就是暴力搜索,并不是什么高效的算法,最多在剪枝一下。组合问题:N个数里面按一定规则找出k个数的集合。原创 2023-01-24 12:55:54 · 1105 阅读 · 0 评论 -
学习二叉搜索树的遍历:从leetcode530的错误回顾
只比较节点的左右节点(因为pre作为形参直接代入,使得每次pre = 树中邻近的节点,而不是遍历顺序中的上一节点)当前节点和左边比较应比较左树最右,和右边比较时应比较右树最左。实现上,就应该让pre等于遍历的顺序,而不是直接作为形参代入。原创 2023-01-16 11:59:23 · 69 阅读 · 0 评论 -
从leetcode110学从底向上和从顶向下
从底向上和从顶向下有什么区别?原创 2023-01-10 12:17:57 · 57 阅读 · 0 评论 -
编程素养
使用库函数最大的忌讳就是不知道这个库函数怎么实现的,也不知道其时间复杂度,上来就用,这样写出来的算法,时间复杂度自己都掌握不好的。例如for循环里套一个字符串的insert,erase之类的操作,你说时间复杂度是多少呢,很明显是O(n^2)的时间复杂度了。如果库函数仅仅是 解题过程中的一小部分,并且你已经很清楚这个库函数的内部实现原理的话,那么直接用库函数。如果题目关键的部分直接用库函数就可以解决,建议不要使用库函数。原创 2022-12-17 08:29:23 · 76 阅读 · 0 评论 -
C++ 内存管理
程序运行时所需的内存空间分为 固定部分,和可变部分,如下:在可变部分中,栈区间的数据在代码块执行结束之后,系统会自动回收,而堆区间数据是需要程序员自己回收,所以也就是造成内存泄漏的发源地。编译器一般都会做内存对齐的优化操作,也就是说当考虑程序真正占用的内存大小的时候,需要认识到内存对齐的影响不同类型的变量紧邻的连续存放,没有空间浪费,但CPU访问内存的速度慢。寻址过程:此时一共需要两次寻址,一次合并的操作。不同类型所占的空间是完全相同的,有空间浪费,但CPU访问内存的速度快。寻址过程:原创 2022-12-17 08:27:55 · 487 阅读 · 0 评论 -
时间复杂度
比较复杂,初学者搞懂大O表示就行原创 2021-09-26 12:00:38 · 116 阅读 · 0 评论 -
c++ 引用 &
比如下文中recur递归函数中的引用参数pos,在多数的递归当中,需要让会变更的索引为引用,否则会出错,多说无益,这里建议大家自己试一下。形参不会改变原来的值,只会在函数调用的时候交换两个数的值,但不会改变内存里的值。但是引用参数就会改变。可以理解为为该变量取了一个别名。原创 2022-12-12 22:02:09 · 196 阅读 · 0 评论 -
大小顶堆/根堆/heap
小顶堆就是小根堆,是small heap的翻译。原创 2022-12-12 13:19:31 · 610 阅读 · 0 评论 -
leetcode406:const、&、static
从这道题的官解可以学到下面几个知识点。原创 2022-12-09 11:28:37 · 356 阅读 · 0 评论 -
leetcode 常见方法归纳
相同整数异或,结果为0。任意整数跟0异或,结果为本身。二分法的题解很多都是写的。原创 2022-12-09 11:13:35 · 673 阅读 · 0 评论 -
leetcode 非常见方法归纳
数学规律1953. 你可以工作的最大周数 - 力扣(LeetCode)可以用其他方法,但是数学是最优解:约瑟夫环:1823. 找出游戏的获胜者 - 力扣(LeetCode)279. 完全平方数 - 力扣(LeetCode)62. 不同路径 - 力扣(LeetCode)有点动脑筋的,但不是数学规律:448. 找到所有数组中消失的数字 - 力扣(LeetCode)中心拓展:647. 回文子串 - 力扣(LeetCode)5. 最长回文子串 - 力扣(LeetCode)占位法nums[num[i]] = -abs原创 2022-12-06 16:27:09 · 425 阅读 · 0 评论 -
归并排序
由底至顶直接排序递归法注意递归法需要找到数组中点,因此比较不适合链表排序原创 2022-12-06 11:51:55 · 275 阅读 · 0 评论 -
C++ stl
关于容器 - C++ STL Tutorial (gitbook.io)这是stl的重点,需要知道每个容器的底层每个容器大致会包含如下内容:可以分为序列式、关联式序列式容器stack,queue是由deque改头换面而来dequedeque 相比于 vector 支持头端元素的快速增删。栈stack 模板类需要两个模板参数,一个是元素类型,一个容器类型,但只有元素类型是必要的,在不指定容器类型时,默认的容器类型为deque。队列queue动态数组vectorvector 可以涵盖其他原创 2022-12-05 11:01:38 · 616 阅读 · 0 评论 -
快速排序的python实现
对写法二进行优化:原本的写法pivot是固定的,但是从数学的角度分析,如果数组本身就是升序或者降序,还进行快速排序,那么每次 partition 分区后子数组大小极不平衡,将退化成 O(n^2) 的时间复杂度算法。我们需要对上述代码进行优化,随机选择一个基点做为比较,称为随机化快速排序算法。注意:pivot是比较的起点,partition函数会让pivot左边都小于pivot,右边都大于pivot。写法二:推荐,可以迁移到其他算法中。写法一:简单,但是扩展性不强。原创 2022-11-24 11:33:52 · 315 阅读 · 0 评论