![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
周赛总结
文章平均质量分 88
zcz5566719
这个作者很懒,什么都没留下…
展开
-
【春招笔试】杂题选讲
开始春招寻找实习的过程中,遇到了很多场笔试。以赛代练,总结在笔试中经常出现的题目。文章目录招行Fintech笔试 4.29训练营分组 (dp思路+二分加速)欢送回家 (dp,枚举最后一个选择的切分位置)招行Fintech笔试 4.29训练营分组 (dp思路+二分加速)dp是类似于打家劫舍的思路,维护了区间的最值,转移方程是考虑是否选取当前点。其实感觉笔试题目在看到解析的时候并不太难,但是很多时候思路被卡死的比较多。这个题目当时考虑了贪心的思路,每次都贪心的选取出来最大的一组,然后把这个过.原创 2021-05-06 11:13:02 · 437 阅读 · 1 评论 -
【周赛总结】1812-1840(模拟退火,约瑟夫问题,数据流问题,timeline,左右遍历,三维DP)
因为近期开始春招了,很难和之前一样有非常充分的时间每周都跟着周赛刷题了。但是总结做过的算法题,这个事情还是给我在春招实习的过程中带来了很大的帮助。我也会继续坚持。文章目录1814. 统计一个数组中好对子的数目(寻找合适的哈希表使用)1815. 得到新鲜甜甜圈的最多组数(模拟退火,dfs)1819. 序列中不同最大公约数的数目(待施工)1823. 找出游戏的获胜者(约瑟夫问题)1824. 最少侧跳次数(贪心、dp)1825. 求出 MK 平均值(TreeMap, 数据流问题)1830. 使字符串有序的最.原创 2021-04-28 10:36:32 · 207 阅读 · 0 评论 -
【周赛总结】LIS问题,比较Integer数值,状态压缩DP。
文章目录1713. 得到子序列的最少操作次数 H 最长递增子序列问题的nlogn解法1719. 重构一棵树的方案数 H优雅的函数式编程比较Intger的数值1723. 完成所有工作的最短时间 H DFS/状态压缩dpd第223,224场周赛和43场双周赛的题目解析。中等题目不难,主要是H题目都还是很有特色的。1713. 得到子序列的最少操作次数 H 最长递增子序列问题的nlogn解法本质上在考察最长连续上升子序列问题,我们需要在坐标对应层次上寻找到一个最长上升子序列。核心是二分的思路,我们维护一个原创 2021-01-26 18:05:50 · 163 阅读 · 0 评论 -
【周赛总结】单调栈,离线查询,绝对值不等式,Trie树
文章目录1696. 跳跃游戏 VI (单调栈)1697. 检查边长度限制的路径是否存在 (离线查询)1703. 得到连续 K 个 1 的最少相邻交换次数 (绝对值不等式)1707. 与数组中元素的最大异或值(Trie树)第220,221场周赛和第42场双周赛1696. 跳跃游戏 VI (单调栈)利用单调栈的思路维护。单调栈的特点在于,栈内存储的是坐标而比较的内容则是映射的数据的数值大小。对于这道题目,我们在进行转移的时候,首先检查栈头的元素是不是距离太远。再加入当前的元素,然后维护单调栈。cla原创 2021-01-02 22:23:38 · 166 阅读 · 1 评论 -
【周赛总结】状态压缩+枚举子集,贪心,数学推导简化DP+单调栈
文章目录1680. 连接连续二进制数字M 进制转换1681. 最小不兼容性H 状态压缩,枚举子集1690. 石子游戏 VII、1686. 石子游戏 VI1691. 堆叠长方体的最大高度H 贪心1687. 从仓库到码头运输箱子H 数学推导化简DP、单调栈1680. 连接连续二进制数字M 进制转换其实题目没有很难,但是有点进制转换的意味在里面。在每次的拼接过程中,我们需要注意把原结果乘多少倍。如果在后面拼接了111,其实需要把之前的内容乘8倍。再加上当前的数字。class Solution {原创 2020-12-17 11:05:23 · 272 阅读 · 0 评论 -
【周赛总结】贪心,链表,左右遍历,单调栈,差分数组,优先队列
文章目录1665. 完成所有任务的最少初始能量H 贪心1669. 合并两个链表M 链表1671. 得到山形数组的最少删除次数H 左右两次遍历1673. 找出最具竞争力的子序列M 单调栈1674. 使数组互补的最少操作次数M 差分数组1675. 数组的最小偏移量 H 优先队列带来第216,217场双周赛和第40场双周赛的题目解析1665. 完成所有任务的最少初始能量H 贪心核心思路是贪心,有一个特点是贪心的题目都是要求什么任选之类,并且数据大。对于一般的任选可以采用状态压缩dp的方法。对于数据比较大的原创 2020-12-16 23:59:20 · 126 阅读 · 0 评论 -
【周赛总结】BFS,状态压缩DP,三进制轮廓线DP
文章目录1653. 使字符串平衡的最少删除次数 M 前后两次遍历1654. 到家的最少跳跃次数 M BFS1655. 分配重复整数 H 状态压缩DP1658. 将 x 减到 0 的最小操作数1659. 最大化网格幸福感 H 轮廓线DP这周的周赛可太难了。两道hard题都是偏难的。1653. 使字符串平衡的最少删除次数 M 前后两次遍历前后两次进行遍历,从前往后遍历中维护一直是a的情况下,需要删除多少b。从后往前遍历过程中,维护一直是b的情况下,需要删除多少a。最后进行一次遍历,找到一个分界点,保证前原创 2020-11-18 22:26:14 · 178 阅读 · 0 评论 -
【周赛总结】树状数组与线段树的板子题目
文章目录1648. 销售价值减少的颜色球M 思路更重要1649. 通过指令创建有序数组H 线段树,树状数组1648. 销售价值减少的颜色球M 思路更重要比较朴素的思路是维护一个优先队列的思路,每次取出最多的那个数字出售,但是这样的复杂度太高了。观察可以发现,如果最多的是5,次多的是2,我们可以把最多的数字卖到只剩两个。并且在出售的过程中其实是一个等差数列的求和问题。class Solution { public int maxProfit(int[] inventory, int orde原创 2020-11-11 11:00:40 · 133 阅读 · 0 评论 -
【周赛总结】优先队列,字典序计数+组合数,最长公共子串dp
文章目录1642. 可以到达的最远建筑(优先队列)1643. 第 K 条最小指令H(组合数计数)1638. 统计只差一个字符的子串数目(最长公共子串DP)1639. 通过给定词典构造目标字符串的方案数H(Dp)1642. 可以到达的最远建筑(优先队列)最开始想到的方法是贪心,寻找合适的位置用梯子。但是这样会被hack的,没有想到使用优先队列的方法。但是想到了的话还是很自然的,维护最大的N个代价即可。class Solution { public int furthestBuilding(in原创 2020-11-04 10:29:12 · 207 阅读 · 0 评论 -
【周赛总结】二分+搜索,求秩问题,并查集的使用
文章目录1631. 最小体力消耗路径(二分+搜索)1632. 矩阵转换后的秩(求秩问题,并查集的使用)第212场周赛。1631. 最小体力消耗路径(二分+搜索)很典型的题目,题目最后要求返回的答案是一个最大值,且我们很容易发现任何小于这个最大值的数都是无法被满足的,任何大于这个最大值的数都是可以被满足的。且判断在给定数值时,能否满足这个事情是比较容易的(BFS或者DFS)。因此我们应该想到用二分+搜索的方法。另外一个思路是采用并查集,我们构建起来相邻的边,并且排序。从小到大进行连线,如同构造一个原创 2020-10-27 22:04:43 · 119 阅读 · 0 评论 -
【周赛总结】并查集筛法,排序,字符串操作与gcd,线段树与逆元,dp压缩
文章目录1627. 带阈值的图连通性(并查集,筛法)1626. 无矛盾的最佳球队(lambda排序)1625. 执行操作后字典序最小的字符串(最大公因数,字符串转换)1622. 奇妙序列(线段树,逆元)1621. 大小为 K 的不重叠线段的数目(dp压缩)1627. 带阈值的图连通性(并查集,筛法)首先这道题很显然是可以用并查集解决的,尤其是查找的工作。复杂度主要卡在构造连通图上。我们可以使用类似求素数的埃氏筛的方法。我们去枚举公因数,最小一定是从threshold开始,最大应该是n。然后在枚举可能公原创 2020-10-21 20:59:18 · 141 阅读 · 0 评论 -
【周赛总结】状态压缩Dp,回文串,flody算法
文章目录1617. 统计子树中城市之间最大距离总结第210场周赛。1617. 统计子树中城市之间最大距离题目的难点我觉着有两个,一个是如何找到不一样的子树,一个是如何计算子树的距离。对于子树中任意两个点的距离,可以考虑flody算法,实现三重循环的方法实现。这里需要特别注意,因为涉及到加法,因此我们不能把最大值设为MAX_VALUE这样在加法中会爆整数。其次对于寻找不一样的子树,其实子树就是把不同的节点组织在一起的。看到数据不是很大,其实可以想到用状态压缩DP的思路解决问题。定义dp[i]原创 2020-10-13 10:47:38 · 124 阅读 · 0 评论 -
【周赛总结】优先队列与有序集合,排序等
文章目录1604. 警告一小时内使用相同员工卡大于等于三次的人 M1605. 给定行和列的和求可行矩阵 M1606. 找到处理最多请求的服务器 H1610. 可见点的最大数目 H1611. 使整数变为 0 的最少操作次数 H总结第36场双周赛和第209场周赛。一共5道题。1604. 警告一小时内使用相同员工卡大于等于三次的人 M主要是好久不用python了。这里因为用到排序,所以写一下python的。如果使用java的话可以用一个hashmap维护,键是人名,值是一个list然会对list进行排序原创 2020-10-08 21:15:20 · 261 阅读 · 0 评论 -
【周赛总结】皇位继承顺序(多叉树), 最多可达成的换楼请求(数位dp)
文章目录1600 皇位继承顺序 M1601.最多可达成的换楼请求 H总结第208场周赛。一共两道题目。1600 皇位继承顺序 M是一道很巧妙的题目,其实变相考察了对于数据结构的理解,很多时候对于数据结构都是简单的调用。这道题仔细观察可以看出来,其实是一个树形结构。最后返回的结果其实是一颗二叉树的前序遍历。但是这里因为是多叉树,所以我们每个节点用一个List存储所有的人名。class ThroneInheritance { String kingName; Map<Str原创 2020-10-08 20:13:42 · 125 阅读 · 0 评论 -
【周赛总结】1582-1591 最小连通树,差分数组,前缀和+哈希表,拓扑排序转换
文章目录1583.统计不开心的朋友1584.连接所有点的最小费用(最小连通树)1585. 检查字符串是否可以通过排序子字符串得到另一个字符串(思路)1588.所有奇数长度的子串和(低复杂度)1589.所有排列中的最大和(差分数组)1590.使数组和能被P整除1591.奇怪的打印机II(拓扑排序)1583.统计不开心的朋友比较暴力的方法,主要考察的还是数据结构。class Solution { public int unhappyFriends(int n, int[][] preferenc原创 2020-09-23 20:02:56 · 162 阅读 · 0 评论 -
【周赛总结】1572-1579 并查集连通图,动态规划路径
第205场周赛,第34场双周赛 2020/09/06文章目录1573. 分割字符串的方案数1574. 删除最短的子数组的1575. 统计所有可行路径1577. 数的平方个数1579.保证图的可遍历性1573. 分割字符串的方案数这道题目给出的明确的说法,需要进行取模。因此我们在进行大数计算时候一定要十分的小心。防止出现爆整形。解决的方法: 把可能的大数都定义为long的形式。class Solution { public int numWays(String s) { i原创 2020-09-11 10:58:34 · 122 阅读 · 0 评论 -
【周赛总结】第204场周赛,组合数求解模板,栈解决正负数乘积
2020/08/30第204场周赛文章目录1569. 将子数组重新排序得到BST1567.乘积为正数的最长子数组1569. 将子数组重新排序得到BST这道题目首先需要找到关键点,再给定了根节点之后,第一个大于根节点和第一个小于根节点的数字必须是固定的,这决定了左右子树的根节点。因此我们知道,这个树除了根节点还具有n个字节点,其中,大于根节点的也就是右子树有m个点,因此我们可以选取CnmC_n^mCnm个位置放置,剩下的位置自然就是左子树。然后左右子树都还存在自身的排列,因此可以递归的求解。注意这原创 2020-09-02 10:35:21 · 125 阅读 · 0 评论 -
【周赛总结】得到目标数的操作数、二维网格探测环、TreeSet、石子游戏IV
2020/08/23 第33场双周赛和第203场周赛文章目录1558、得到目标数的操作数1559、二维网格探测环1558、得到目标数的操作数这道题在比赛时候把我关了。没有很敏锐的意识到涉及到2的次方的操作应该首先想到二进制的方法,这道题目很巧妙的计算出来了每个数字变为0所需要的次数。最终我们的答案应该是两部分的和,一个是对每一位数字进行修饰,修饰的表示就是保证每一位数字的二进制只有最高位是1,其余的都是0。第二部分就是计算数组中全部数组数字变为二进制之后最长的。Java操作注意(num>&g原创 2020-08-25 00:05:11 · 224 阅读 · 0 评论 -
【周赛总结】第32场双周赛,第201场周赛
2020/08/09 未参加文章目录第32场双周赛1541.平衡括号字符串的最少括号数1542.最长超赞回文串第201场周赛1544.整理字符串1547 切棍子的最小成本第32场双周赛1541.平衡括号字符串的最少括号数对于括号问题,似乎分情况讨论比较好。一般可以考虑维护两个变量,分别表示目前可使用的(和)的数量。这道题目有点偏方法。class Solution { public int minInsertions(String s) { int left = 0, an原创 2020-08-13 20:50:31 · 112 阅读 · 0 评论 -
【周赛总结】子树中标签相同的节点数,最多不重复子字符串,找到最接近目标值的函数值
2020/07/19 rank:492/5779 AC: 2/4这次的题目比较难,只A了两道。第二题,子树中标签相同的节点数方法是采用DFS的方法处理树有关的问题,这道题目的难点在于如何保存子树的信息。同时需要注意是一个无向图。首先我们要记录一个集合visit这个集合表示了已经访问的节点,可以防止子节点重新回到父节点从而进入死循环。同时我们每次查找一个节点的子函数要返回这个子树保存的全部字典信息。因此要注意字典的更新。class Solution: def countSubTrees(原创 2020-07-20 21:08:34 · 196 阅读 · 0 评论 -
【周赛总结】石子游戏IV,仅含1的子串数,概率最大的路径,服务中心的最佳位置——dijstra和梯度下降算法
第三十场双周赛 2020/07/11 rank 432 / 2545 ac 4/4第197场周赛 2020/07/12 rank 360 / 5274 ac 3/4题目1,石子游戏是一道比较经典的dp问题,但是还是因为缺少经验,卡了一些时间。思路还是比较明确的,dp[i]表示剩余 i 个石子的情况下,先手能否获胜。初始条件是dp = [False]*(n+1),对于所有的平方数,都是True。每次进行转移时,枚举先手方的策略拿j个石子,此时要求后手dp[i-j] == False则,dp[i原创 2020-07-12 22:01:44 · 193 阅读 · 0 评论 -
【周赛总结】第196场周赛——全一子矩阵,交换k次的最小整数
2020/07/05 未参赛,AC 3/4第三题 全一子矩阵思路参考最大矩形。设计一个dp[i][j]表示以i,j为右下角的矩阵的最大值,我们需要枚举宽度和高度,但是我们可以通过预先设计一个矩阵,存储每个位置上方最大的连续矩阵1个数。class Solution: def numSubmat(self, mat: List[List[int]]) -> int: ## 考虑时间复杂度降低为O(nnm) ## 定义dp[i][j]表示i,j这个点上方的连原创 2020-07-07 00:46:09 · 1102 阅读 · 0 评论 -
【周赛总结】第29场双周赛,第195场周赛——连续最大1的个数,并行课程II,满足不等式的最大值
2020/06/28 第29场周赛 rank:120 / 2260 AC:4 第195场周赛为参赛 AC 4题目三:删掉一个元素以后全为 1 的最长子数组本题实际上有一个母题,这里我们讲解母题。最大连续1的个数 III。是一道比较适合采用滑窗解决的问题,思路是我们统计出现的0的位置和在窗内0出现的次数,一旦超过次数,更新左端点即可。是一个比较好的框架思路,需要借助一个双端队列完成快速的更新左端点的位置。class Solution: def longestOnes(self, num原创 2020-06-29 17:01:59 · 544 阅读 · 0 评论 -
【周赛总结】第194场周赛——保证文件名唯一,洪水泛滥,最小生成树
未参加的比赛,感觉leetcode的比赛确实越来越难了第二题 保证文件名唯一一道有意思的题目,要求对相同名字的文件添加序号。我们需要考虑减小复杂度,也就是每次遇到重复的文件名时候,需要维护一个字典去存储该文件名已经命名到了哪个序列。class Solution: def getFolderNames(self, names: List[str]) -> List[str]: if not names: return [] #原创 2020-06-21 22:14:28 · 141 阅读 · 1 评论 -
【周赛总结】第193场周赛——制作花(合并选取区间),树节点的第 K 个祖先
2020/06/14 rank 1173/3803 ac 2引言状态不是很好,这周只a了两道题,思路不畅。制作m束花的天数首先想到采用二分的方法,核心在于注意到题目的解具有单调性,也就是说,在第i天可以,则在之后的第i+1天也是都可以的。class Solution: def minDays(self, bloomDay: List[int], m: int, k: int) -> int: ## 二分的方法 right = max(bloomDay原创 2020-06-14 22:44:56 · 97 阅读 · 0 评论 -
【周赛总结】第28场双周赛——不重叠的子数组,邮筒投递
2020/06/13 rank 326 ac 3引言感觉最近状态都不是特别好,可能下周会给自己放个假,暂时不比赛。第一题简单题目可以用暴力的方法,也可以采用单调栈的方法作为连续,这里放一下单调栈的方法。class Solution(object): def finalPrices(self, prices): # 单调栈的方法,需要考虑不修改的情况,这里直接用ans,另外单调栈一般都是存储索引 stack = [] ans = price原创 2020-06-14 21:04:24 · 175 阅读 · 0 评论 -
【周赛总结】给房子涂色 III——三维DP
2020/06/07 rank 561 / 3614 AC:3/4重点讲解最后一题,是一道三维DP问题,关键还是在于想清楚,什么是状态,状态如何定义。状态的转换方法。首先我们不能把题目想的过于复杂,题目的本质最多就是一个dp问题,我们还是可以从左往右依次进行染色。这道题目做的时候复杂是因为题目给了多个限制,一个是要求得到满足的分类,同时还需要保持成本最小的要求。坑神在讲解里面提到,“限制给的越死,dp的状态越容易定义” 我们可以思考下,这个问题涉及到了那些东西。状态一定是由性质组成的,我们需要分析清原创 2020-06-07 17:37:11 · 323 阅读 · 0 评论 -
【周赛总结】第191场周赛——两个盒子中球的颜色数相同的概率
2020/05/31 ACE : 3/4 rank:322/3686没有完全a完,早上的比赛没太睡醒,中间被罚了两次。比赛链接还是重点讲解第四题吧,比赛时候没有a出来。两个盒子中球的颜色数相同的概率题目的翻译真的不是很好,是要求计算两个盒子里,a盒中颜色不同的球的种类和b盒中颜色不同的球的种类相同的概率。一看就是排列组合题目,首先我们需要得到分母。可以考虑先作为完全不一样的球,计算全排列n!,然后在依次进行捆绑,同一个种类的球是不存在区别的,因此可以随便换位置。需要除以每个种类的球的个数的原创 2020-05-31 20:36:53 · 780 阅读 · 0 评论 -
【周赛总结】第27场双周赛——摘樱桃机器人,三维DP
2020/05/30 AC:4 rank:124/1966比赛链接前面的题不难,主要写一下第四题。一道dp问题,关键问题还是在于如何选取状态和推出状态转移方程注意看题目的要求,当两个机器人在位置重叠的时候,是只能采摘一次的,因此我们实际上是需要知道两个机器人在每一行的位置的。设置状态dp[i][j][k]表示第i行,第一个机器人在位置j,第二个机器人在位置k。转移的状态是每次下一行的某个机器人的位置可能从上一行的三个位置转移得到。因此两个机器人,一共存在九个可能的转移来自。并且考虑重复原创 2020-05-31 16:30:21 · 238 阅读 · 0 评论 -
【每日一题】柱状图中最大的矩形——单调栈练习题
2020/05/30 单调栈的练习题目引言单调栈的题目是比较技巧的一类题目,涉及到什么样的问题考虑采用单调栈;单调的选取,选择单调增还是单调减;单调栈的维护;以及如何利用单调性解决问题。柱形图问题一种典型的单调栈问题。之所以思考采用单调栈的方法是因为计算每个部分的面积与最大最小的关系有关。在计算面积时候回去寻找当前长方形的左右大于该高度的连续长方形。因此采用单调栈的话,我们需要找一个单调增的栈,保证该长方形左侧连续无更高的长方形。并且在每次被弹出时计算该高度的长方形的最大宽度。因为被弹出时说明右原创 2020-05-30 15:00:01 · 266 阅读 · 0 评论 -
【leetcode周赛】前缀检查,定长子串的元音数,二叉树回文路径,最大点积
2020/05/24 第190 场周赛引言没参加,但是赛后a了四道题,这次的周赛相对简单,赛后全a的有500人。简单题前缀检查没啥多说的,就善用str.split()函数还是很关键的。中等题:定长子串元音数:滑动窗口的思路,很简单二叉树中的伪回文路径:二叉树的dfs题目,可以学习下。还是考虑迭代和递归两种思路,我写的是dfs递归的思路,题解有人给出了不错的迭代思路。递归思路比较明确,dfs进行搜索,题目给出节点的数值最多是1-9,因此直接利用一个数组进行记录,对于回文串核心是最多只原创 2020-05-24 16:38:31 · 122 阅读 · 0 评论 -
【leetcode周赛】第 189 场周赛
2020/05/17 第189场周赛总结三个题目,重新排序句子,重复的收藏清单,圆形靶的最大目标重新排序句子主要考察对字符串处理api的熟练使用需要进行操作分为,首先将一串字符串改为存储每个单词的列表,然后按照字符的长度进行排序,将列表整合为字符串,最后修改大小写。class Solution: def arrangeWords(self, text: str) -> str: words = [word for word in text.split()]原创 2020-05-17 18:53:37 · 175 阅读 · 0 评论 -
【第188周周赛】异或三元数组,收集苹果,切披萨的方案数
2020/05/10 第188周周赛第二题确实想到了前缀和的思路,但是没有对问题更加进一步的剖析。题目要求a==b其实相当于要求了arr[i]^...^arr[k] == 0并且对于[i,k]区间中任意拆分都可,也就是j可以在其中任取。因为我们可以实现时间复杂度为O(n2)O(n^2)O(n2)的方法。每次记录起点i,去寻找终点k。class Solution: def countTriplets(self, arr: List[int]) -> int: ## 利用原创 2020-05-10 23:40:09 · 190 阅读 · 0 评论