
leetcode
文章平均质量分 58
行走的帝企鹅
努力变强吧
展开
-
879-盈利计划
题目879. 盈利计划 - 力扣(LeetCode) (leetcode-cn.com)思路本题目核心问题为对于特定的minProfit和特定的n,在groups中选择一些工作使其满足要求n和minProfit的限制,选择方案总共有多少种。因此,我们从最后一项工作group[last]开始考虑,对于该工作,有两个可能性:如果选择该工作,则问题转换为对于minProfit = minProfit - profit[last]以及n = n-group[last],在group中前last项中进行选择原创 2021-06-09 15:50:10 · 121 阅读 · 0 评论 -
160-相交链表
题目160. 相交链表 - 力扣(LeetCode) (leetcode-cn.com)思路hash表我们将一个链表中的所有结点加入到一个hash表中,遍历第二个链表检查其中结点是否在hash表中,找到的第一个在hash表中的结点就是两个链表的交叉点。裁剪和比较我们遍历两个链表分别求出其长度,然后计算出长度差h。接着,我们使用两个指针分别指向短链表的头部结点以及长链表的第h个结点。之后,同步一同两个指针,如果指向同一个结点则为两个链表相交的结点。纯双指针使用两个指针a,b分别指向两个链表原创 2021-06-05 22:52:03 · 222 阅读 · 2 评论 -
139-单词拆分
题目139. 单词拆分 - 力扣(LeetCode) (leetcode-cn.com)思路使用动态规划求解该题目。dp[i]记录s[0 : i]是否匹配字典中的单词(即能够通过空格划分为多个字典中单词的组合)。求解dp[i]时,我们假设已经求得所有dp[j], j < i,并尝试从s[0:i]的尾部匹配一个词典中的单词(如下图所示)。匹配的方法为遍历词典中的所有单词(词典中不同长度的单词对于不同的j),尝试找到同s[j + 1 : i]匹配的单词。如果找到这样的单词,并且此时dp[j] =原创 2021-06-03 22:37:52 · 148 阅读 · 0 评论 -
477-汉明距离总和
题目477. 汉明距离总和 - 力扣(LeetCode) (leetcode-cn.com)思路最直接的算法是遍历所有的数字组合并将每组数字的汉明距离求和,然而其时间复杂度为O(n2)O(n^2)O(n2),会超时。我们考虑通过分治的方法来求解。首先考虑我们以及计算得到数组nums前k个数组成的区间[0, k-1]的所有数字的汉明距离总和total(0, k - 1),那么[0,k]中所有数字汉明距离的总和total(0, k)就等于total(0, k-1)加上nums[k]同前k个数字的汉明距离原创 2021-05-28 19:34:26 · 152 阅读 · 0 评论 -
1707-与数组中元素的最大异或值
题目1707. 与数组中元素的最大异或值 - 力扣(LeetCode) (leetcode-cn.com)思路该题目要求某个数字同数组中的数字异或的最大值,因此使用前缀树最为高效。如下题目也是使用前缀树来实现快速求解两个数最大异或值的,关于前缀树的构建和求解异或值最大的数的过程可以参考此博客。421-数组中两个数的最大异或值_j5856004的博客-优快云博客如果不考虑本题目中查询请求中的最大数字限制,我们只需要将原数组的所有数加入到前缀树中,再使用上述题目中使用的搜索与n异或结果最大的原创 2021-05-23 15:08:33 · 199 阅读 · 0 评论 -
1738. 找出第 K 大的异或坐标值
题目1738. 找出第 K 大的异或坐标值 - 力扣(LeetCode) (leetcode-cn.com)思路第一步求矩阵所有坐标(a,b)的值,根据异或运算的性质,有(a,b) = (a - 1, b) ^ (a, b - 1) ^ (a - 1, b - 1) ^ matrix[a][b](a,b)表示第a行,第b列如图所示,(a,b)坐标对应了绿色(左上角3x3)的矩阵中所有元素的异或结果,(a-1,b)对应了蓝色(左上角2x3)的矩阵中所有元素异或的结果,(a,b-1)对应了原创 2021-05-19 20:17:29 · 197 阅读 · 1 评论 -
1442-形成两个异或相等数组的三元组数目
题目1442. 形成两个异或相等数组的三元组数目 - 力扣(LeetCode) (leetcode-cn.com)思路首先,本题存在区间求和问题,因此需要求出前缀数组prefix,使得prefix[i] == arr[0] ^ arr[1] ^ ... ^ arr[i]。第二,观察可知,要满足a == b,即满足a ^ b == 0,即arr[i] ^ ... ^ arr[k] == 0。根据前缀数组求区间的方法,即有prefix[k] ^ prefix[i-1] == 0,即prefix[k]原创 2021-05-18 23:34:03 · 136 阅读 · 0 评论 -
421-数组中两个数的最大异或值
题目421. 数组中两个数的最大异或值 - 力扣(LeetCode) (leetcode-cn.com)思路使用二重循环遍历所有可能的组合可以解决该问题,不过时间复杂度过大,会导致运行超时。为了优化运行速度,对于一个数n, 我们需要尽可能快的找到另一个数m,使得在所有和n组合的数中,n^m的结果最大。根据异或运算的性质,为了使得计算结果尽可能地大,我们需要保证高比特位有尽可能多地1,因此,从最高比特位开始(本题目中为第30位(从0开始)),对于n中为0的比特位,我们需要尽可能的找该比特位为1的原创 2021-05-16 22:57:05 · 410 阅读 · 0 评论 -
12-整数转罗马数字
题目12. 整数转罗马数字 - 力扣(LeetCode) (leetcode-cn.com)思路对于千位以上的部分,每个M表示1千;千位以下,百位以上的部分,CM表示900,D表示500,CD表示400,C表示100;百位以下,十位以上的部分, XC表示90,L表示50,XL表示40,X表示10;十位以下的部分, IX表示9,V表示5,IV表示4,I表示1。可以看到,数字会优先使用最大的表示单位进行表示,不足够使用大单位表示的数字才使用小单位表示(即100不会用100个最小的单位I来进行表原创 2021-05-15 20:09:26 · 105 阅读 · 0 评论 -
1269-停在原地的方案数
题目1269. 停在原地的方案数 - 力扣(LeetCode) (leetcode-cn.com)思路我们从最后一步开始考虑,最后一步需要到达0, 则上一步必定到达1或者0,更一般地说如果第s步到达了p,那么第s-1步必须到达p - 1或者p或者p + 1。所以,如果我们能够分别知道第s - 1步到达p, p - 1和p + 1的方案数量,那么第s步到达p的方案数量就是第s - 1步到达p, p - 1和p + 1的方案数量的总和。根据上述分析,我们需要从第0步开始,求出第s (0 <=原创 2021-05-13 16:29:20 · 147 阅读 · 0 评论 -
1310-数组异或查询
题目1310. 子数组异或查询 - 力扣(LeetCode) (leetcode-cn.com)思路根据异或运算的特点(x ^ x = 0),一个数组中任何一个区间内元素的异或结果可以通过整个数组的前缀元素异或结果求得,即有xor(a, b) = xor(0, a-1) ^ xor(0, b-1)根据该特点,我们只需要遍历原数组,求出所有的前缀元素异或结果并保存在一个数组中即可实现在O(1)O(1)O(1)的时间内求出任意区间的异或值。代码class Solution {public:原创 2021-05-12 10:21:12 · 125 阅读 · 0 评论 -
1734-解码异或后的排列
题目1734. 解码异或后的排列 - 力扣(LeetCode) (leetcode-cn.com)思路该题目初看同1720. 解码异或后的数组 - 力扣(LeetCode) (leetcode-cn.com)类似,实际上,1720中直接给出了原数组的第一个数,因此很简单,而本题的难点就在于如何求出原数组的第一个数。根据题目描述,我们可以知道原数组是从1到n的正整数的排列,即原数组所有元素的异或结果为1 ^ 2 ... ^ n(异或运算满足交换律)。另外,异或运算的特点x ^ x = 0,如果我们原创 2021-05-12 10:19:57 · 139 阅读 · 0 评论 -
1482-制作 m 束花所需的最少天数
题目1482. 制作 m 束花所需的最少天数 - 力扣(LeetCode) (leetcode-cn.com)思路首先我们需要检查总的花朵数量是否足够制作花束,如果不够则直接返回-1。在花朵够的情况下,最大的等待天数max_day是所有花的开放的天数(max(bloomDay)),最少等待的天数min_day是第一朵花开放的天数(min(bloomDay))。然后我们需要确定在第d天时(d∈[min_day,maxday]d \in [min\_day, max_day]d∈[min_day,m原创 2021-05-09 12:58:57 · 164 阅读 · 0 评论 -
1723-完成所有工作的最短时间
题目1723. 完成所有工作的最短时间 - 力扣(LeetCode) (leetcode-cn.com)思路为了求得最短的工作时间,我们需要给每个工人分配适当的任务。我们从最后一个工人开始考虑,该工人共计有2n2^n2n种工作分配方案(nnn为工作数量),从不分配任何任务到分配所有任务。当我们确定该工人的一种分配方案后,就需要给剩余的工人分配剩余的任务,显然,给剩余的工人分配剩余的任务是给所有工人分配所有任务的一个相同类型的子问题,我们可以考虑使用动态来解决。根据上述分析,我们需要解决的问题为在原创 2021-05-09 00:04:42 · 1067 阅读 · 0 评论 -
1720-解码异或后的数组
题目1720. 解码异或后的数组 - 力扣(LeetCode) (leetcode-cn.com)思路本题很简单,根据异或运算的基本性质,a ^ a = 0,则有a ^ b ^ b = a。对于新数组encode和原数组origin,有encode[i] = origin[i] ^ origin[i+1], 因此encode[i] ^ origin[i] = origin[i + 1]。代码class Solution {public: vector<int> decod原创 2021-05-07 00:55:24 · 96 阅读 · 0 评论 -
740-删除并获得点数
题目740. 删除并获得点数 - 力扣(LeetCode) (leetcode-cn.com)思路为了获取最多的点数,对于数组nums中的数字n,只存在所有的数字n均被记为点数(选择了数字n)和所有的数字n均没有被记为点数的情况(选择了数字n+1或者n-1使得所有n均被删除),即不存在只选择部分数字n的情况。根据上述分析,本题目可以转化为从存在一些各不相同的数字,每个数字对应一个分数,当选择了数字n就不能选择数字n+1和n-1,求所有可能选择方案得到的分数中的最大分数。设最大的数字为n, 我们原创 2021-05-06 00:04:14 · 122 阅读 · 0 评论 -
1473-粉刷房子 III
题目1473. 粉刷房子 III - 力扣(LeetCode) (leetcode-cn.com)思路解决这类搜索问题最重要的部分是考虑如何将问题切分成类似的规模更小的问题, 对于本题, 存在三个决定问题规模的量: 房子数目、颜色数目和街区数目。如何控制这些量来实现减小问题规模并同时使得大规模的问题能够利用小规模问题的结果呢?我们需要从最大规模的问题开始考虑,考虑最大规模的问题需要依赖哪些小问题的答案来解决。最大规模的问题需要涂m个房子, 我们考虑第m个房子的涂色方案(暂不考虑已经涂色的情况),原创 2021-05-04 22:15:56 · 313 阅读 · 0 评论 -
7-整数反转
题目7. 整数反转 - 力扣(LeetCode) (leetcode-cn.com)思路基本流程如下:#mermaid-svg-E9KKBGlWuqlQ5tZQ .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-E9KKBGlWuqlQ5tZQ .label text{fill:#333}#mermai原创 2021-05-03 10:19:40 · 71 阅读 · 0 评论 -
554-砖墙
题目554. 砖墙 - 力扣(LeetCode) (leetcode-cn.com)思路什么是空隙?首先需要理解一个隐含的条件,即空隙是不占宽度的,即宽度为1和2的中间存在空隙的两堵墙和宽度为3的一堵墙的总宽度是相同的,墙的边缘就算作一个空隙。比如下面这个例子中,第一行的0,1,3都是墙的边缘,均算作一个空隙,第二行0,3是墙的边缘算作空隙。pos 0 1 2 3 | 1 | 2 | | 3 |墙位置和空隙的位置要计算某条线穿过的墙的数量,我们需原创 2021-05-02 10:48:47 · 91 阅读 · 0 评论 -
690-员工的重要性
题目690. 员工的重要性 - 力扣(LeetCode) (leetcode-cn.com)思路该题目中员工的层级关系组织成了一棵树,然而实际存储过程并没有按照树数据结构存储(只存储了id,没有存储数据结点)。为了实现快速通过id访问数据结点,我们首先需要将员工数据存储到hash表中。之后就需要以一个员工为根节点遍历员工层级树,将遍历过程中的所有结点相加,可以使用DFS或者BFS,下边的代码使用了BFS。代码/*// Definition for Employee.class Emplo原创 2021-05-01 23:28:06 · 122 阅读 · 0 评论 -
137-只出现一次的数
题目137. 只出现一次的数字 II - 力扣(LeetCode) (leetcode-cn.com)思路我们知道对于异或运算,0⊗a=a0 \otimes a = a0⊗a=a并且a⊗a=0a \otimes a = 0a⊗a=0, 如果存在某种运算⊕\oplus⊕,使得0⊕a=a0 \oplus a = a0⊕a=a并且a⊕a⊕a=0a \oplus a \oplus a = 0a⊕a⊕a=0,那么我们只需要将所有数字使用该运算执行一次即可得到仅出现一次的数字。我们知道异或运算能够实现0⊗a原创 2021-05-01 23:06:23 · 80 阅读 · 0 评论 -
403-青蛙过河
题目403. 青蛙过河 - 力扣(LeetCode) (leetcode-cn.com)思路一个问题:利用青蛙能否到达第j个石子(j<i)的信息, 我们怎么判断青蛙是否能够到第i个石子呢?第i个石子和第j个石子之间的距离为gap = stones[i] - stones[j],因此,如果青蛙能够到达第j个石子,并且到达第j个石子时的跳跃长度为jump,在jump + 1 == gap || jump == gap || jump - 1 == gap时青蛙可以从第i个石子到第j个石子,而其原创 2021-04-29 12:30:27 · 207 阅读 · 0 评论 -
633-平方数之和
题目633. 平方数之和 - 力扣(LeetCode) (leetcode-cn.com)思路题目需要尝试搜索两个数,使其之和为c, 首先我们需要确定搜索范围。要满足a2+b2=ca^2 + b ^2 = ca2+b2=c,则必有0≤a≤c, 0≤b≤c,0 \le a \le \sqrt{c},\ 0 \le b\le \sqrt{c},0≤a≤c, 0≤b≤c,因此,搜索范围限制在[0,c][0,\sqrt{c}][0,c]。我们设正确结果位于[a,b][a原创 2021-04-28 21:17:39 · 94 阅读 · 0 评论 -
938-二叉搜索树范围和
题目938. 二叉搜索树的范围和 - 力扣(LeetCode) (leetcode-cn.com)思路通过遍历整个二叉搜索树找出在low和high之间的结点并累加即可解决问题。如果使用递归的方式,以结点node为根结点的树的计算结果=左子树计算结果 + 右子树计算结果 + 在low和high范围内的当前值。为了减少不必要的遍历(剪枝),可以利用二叉搜索树左子树 <= 根节点 <= 右子树的特性,避免访问某些子树。代码class Solution {public: int原创 2021-04-27 07:57:37 · 129 阅读 · 0 评论 -
1011-在 D 天内送达包裹的能力
题目1011. 在 D 天内送达包裹的能力 - 力扣(LeetCode) (leetcode-cn.com)思路问题1: 如何判断载重量为load的船至少需要多少天能够运送所有包裹呢?我们只需要遍历一次weights数组,从第一个元素开始求和,直到和大于load(尽可能把船装满),此时可以确定当前元素之前的元素应该安排在一天运送。我们重置和为0,并添加当前元素(因为当前元素加到前一天导致船超载),继续遍历数组后续元素即可得到所需的天数。如果某个元素超过了load则结果为无限大(INT_MAX原创 2021-04-26 09:12:40 · 127 阅读 · 0 评论 -
897-递增顺序搜索树
题目897. 递增顺序搜索树 - 力扣(LeetCode) (leetcode-cn.com)思路本题目要求将一个二叉搜索树转换成顺序单链表。一个问题:如果我们已经得到了一棵二叉搜索树的左子树和右子树转换得到的结果,如何计算最终结果呢? 4 | 2----+----7 | |1--+--3 6--+--8对于根节点4,其左子树计算结果为1,2,3,右子树计算结果为6,7,8,我们只要用根节点4将左右子树的结果连接起来即得到最终原创 2021-04-25 23:07:19 · 132 阅读 · 0 评论 -
377-组合总和
题目https://leetcode-cn.com/problems/combination-sum-iv/思路一个问题:如果我们知道目标值为target−n,(n∈[0,target])target - n, (n \in [0,target])target−n,(n∈[0,target])的结果,如何求得目标值为targettargettarget的结果呢?对于目标值为targettargettarget的组合,考虑其组合序列中最后一个数字,假设其为nnn,我们考虑nnn的所有可能情况,并将原创 2021-04-24 11:03:52 · 116 阅读 · 0 评论 -
28-实现 strStr()
题目https://leetcode-cn.com/problems/implement-strstr/说明下文中数组元素的表示substr[i:j]包括起始和结束边界的值(即包括substr[i]和substr[j])。next数组生成使用kmp算法实现子串匹配, kmp算法核心在于求解next数组,next数组用于计算在子串和父串匹配过程中出现某个字符不匹配时子串指针应该被设置的位置。对于子串substr,next[i]记录了substr[0:i]的中相等的最长真前缀substr[0:x原创 2021-04-23 21:48:50 · 77 阅读 · 0 评论 -
368-最大整除子集
题目https://leetcode-cn.com/problems/largest-divisible-subset/思路一个问题:如何判断整数rrr是否能够加入一个整除集QQQ形成一个更大的整除集?如果min(Q)<r<max(Q)min(Q) < r < max(Q)min(Q)<r<max(Q),我们则需要遍历整除集 QQQ来判断rrr是否能够加入该整除集,如果rrr需要满足以下两个条件则能直接确定能够加入QQQ形成一个更大的整除集KaTeX p原创 2021-04-23 21:42:13 · 176 阅读 · 0 评论