随笔分类 - leetcode
摘要:思路: 这个题可以在421. 数组中两个数的最大异或值建立的字典树基础上完成。 这道题多了两个要求,第一个是nums里小于queries[i][1]得元素与queries[i][0]的元素相异或并取最大值,返回的结果数组中结果的存放顺序要按照queries的顺序。 那么我们考虑第一个要求,如果我们每
阅读全文
摘要:思路: 暴力很明显,两重for循环即可完成。 如何优化成O(n),自己想了想,两数异或的结果是在(X-Y,X+Y)之间的,然后我就直接for找到一个最大的数,然后用其他的数与他异或取最大的,还是错了,如2,10,8,2 ^ 8 =10,10 ^2 =8。 然后就看了题解,用了字典树的结构。 字典树简
阅读全文
摘要:思路: 这个题感觉更像是数学推导,这里我注意到题目的“假设两个玩家每步都是用最优解”,疑问这个最优解是个什么意思。 首先我们来推导一下,假如去掉一个数让剩下的数异或为0,根据异或的性质:相同的数异或为0 and 任何数与0异或还是本身 可以得到下面的式子: xorsum是所有数异或的结果,nums[
阅读全文
摘要:思路: 一开始是打算用hash表来记录每个字母代表的数字的,但是想了一下好像直接if判断来加也可以,然后就开始if了。 然后想判断IV IX这类的的时候判断条件设置的是i!=n-1&&s[i+1]='V'这样的,也是能做的,但是if太多了。 我这时候并没有想到IV这种情况可以概括为小的数放在大的数左
阅读全文
摘要:思路: 虽然能看出来是动态规划了,但是还是写不出。我想要如何判断交叉呢,官方题解用的动规 就很巧妙,没有直接涉及判断交叉,但却解决了这个问题。 dp[i][j]定义为nums1[0:i]连接nums2[0:j]的最大连线数 我们是要两重for循环的 ,对于dp[i][j],我们判断nums1[i]=
阅读全文
摘要:思路: DFS寻找x和y,并记录他们所在的深度。 因为题目要求深度相同,父亲节点不同,所以我们还需要记录他们的父亲节点。 所以我们对x和y都建立一些信息, int x; TreeNode* x_fa; int x_depth; bool x_found; int y; TreeNode* y_fa;
阅读全文
摘要:思路: 求前k大的,并且要记录出现的次数,那么就想到是堆+hash表了。 然后就是hash表记录次数的同时加进堆里,但是这里就出现一个问题,当出现的次数一样的时候没法按字母大小排序。所以我们得自己写堆的排序函数: 看了官方题解,使用的lambda函数。 方法如下 auto cmp = [](cons
阅读全文
摘要:思路: 还是前缀异或,只是这次变成了二维。 求第n大的数,我想的直接用小顶堆,限制它元素个数为k,那么最终留下来的就是最大的k个数,堆顶就是第k大的数了。 如果堆没有满就加进堆里,如果满了就判断要加入的元素是否大于堆顶,大于就pop再push. 也可以排序再取第k+1个元素,也可以用快速选择算法来找
阅读全文
摘要:思路: 类似的题做过了,一个优化算法就是(s0s1s2...si-1)(s0s1s2....si-1....sn)=(si...sn). 因此我们就能计算出前缀异或的结果从而将暴力算法O(n4)优化成O(n^3) 代码: class Solution { public: int countTripl
阅读全文
摘要:思路: 当获取x后,x+1和x-1大小的元素不能再取,我们得到的点数为x*x的个数。 因此我们需要记录每个nums元素的个数,同时获得排序后的nums中出现过的元素,只要一个,用来判断上次取的数和这次取的数是否差为1或-1。 我们用hash表count来记录元素出现的次数,用dp数组存放出现过的元素
阅读全文
摘要:思路: 对于这个题,除开第一个位置不能从左边过来,和最后一个位置不能从右边过来,其余位置都可以有三种可能。 三种可能分别是,不动,左移,右移。因此我们可以得到状态转移方程。 我们定义dp[step][idx],step为移动次数,idx为当前的位置 首先是第一个位置:dp[i][0] = dp[i-
阅读全文
摘要:思路: 因为我们要穿过墙,并且要穿过的砖块最少,因此我们应该从从墙缝最多的地方穿过。 那么问题来了,我们如何求得墙缝呢? 每行每个砖头有自己的宽度,墙缝存在两墙块之间,并且每行的总宽度相同,因此我们通过前缀和,来等效求解墙缝。 假设一行砖头宽度为[1,2,2,1],那么缝隙的标号就可以设定为1,1+
阅读全文
摘要:思路: 还是异或的题。 因为我们前一道题已经得到一个算法,(3 ^ 4 ^ 5) = (1 ^ 2) ^ (1 ^ 2 ^ 3 ^ 4 ^ 5),所以在这题也可以通过该算法来减少异或次数。 我们有个很直接的想法就是从queries没获取一个查询范围,就从L-R的异或,那么最坏时间复杂度就是O(n*m
阅读全文
摘要:思路: 就我的小脑袋瓜,除了for循环遍历,还能想到什么高级的数学方法呀? 我下意识想到用异或运算的性质,但是没想到用的哪个。看了题解确信了数学方法我做不出来 。 代码: class Solution { public: int xorOperation(int n, int start) { in
阅读全文
摘要:思路: 利用异或规律的一道题。 首先明确题目对perm的定义,前n个正整数的排列,n为奇数。(因为没重视这句,想了好久都想不出,看了讨论里面说到这个才恍然大悟) 意思为perm为一个数组,里面放的是数字1-n,且数量为奇数。 又因为encoded[i]=perm[i-1]^perm[i] 我们举个n
阅读全文
摘要:思路: 刚开始是想暴力双循环,但是发现思路只能解决连续且k>1的情况。想不出其他的了。 看了题目标签,二分法。但是还是没思路怎么个二分。 看了题解。之前说过二分利用的是二段性,那么我们这两段的分界设定为 最短完成采花的天数,也即答案。 (0,res)这段天数的大小是不能完成采花的,(res,+∞)z
阅读全文
摘要:思路: 最直观的就是分别用两个数组来存放两棵树的叶子节点。 所以就是dfs每棵树,当遍历到叶子节点时,就加入进数组里。最后得到的两个数组在判断长度是否相等,不等就return false,相等就遍历判断是否存在不相等的元素,有就return false 代码: DFS递归 /** * Definit
阅读全文
摘要:思路: 这个题 很明显用栈来处理,但是,我有思路了,一做就错,自己写的乱乱的,理不清楚逻辑了。 首先我们需要两个栈一个用来放数字,一个用来放字符串。当我们遇到'['时,就把上次的暂存的字符串和得到的数字大小分别放入各自的栈中。如果遇到']'就开始取出栈顶的数字,并且以这个大小循环这多次,把存放字符串
阅读全文
摘要:思路: 这样的题给的值都会很大,再平方大概率会超int,那么我们在声明变量时需要long变量。 同时应该把传入的c的大小降下来,因为大于根号c的数,是不可能被使用的,所以我们从0-根号c开始找。 因为是a2+b2=c,所以我们要两次循环0-c的数,但是直接两个for循环会导致超时。 那么我们就采用双
阅读全文
摘要:思路: DFS递归即可,这里要多关注的是数字和"->"的关系。 因为我们"->"是在添加数字后加,所以我们多一个判断如果当前加入的是叶子节点,再加入val后,就把这一串字符串加入到res数组中,并return。这样就能避免最后多一个“->”。 代码: /** * Definition for a b
阅读全文

浙公网安备 33010602011771号