05 2021 档案
摘要:思路: 暴力,直接超时。问题在于如何解决需要两重循环nums数组和循环判断每个位的不同所耗时间。 如果我们通过每次遍历nums数组的同时位移i位,这样只需要 O(n)的循环,虽然这里有一个i需要递增,但是一个常数,i最大为30. 那么这个方法如何判断汉明距离呢? 我们想 一个数num,他的第i位为
阅读全文
摘要:思路: .....原来我没做过吗..... 4的幂已经说了 n&(n-1)==0 就能过滤掉奇数了,因为二进制每一位都是2的幂,那么剩下的都是为2的幂的偶数了 class Solution { public: bool isPowerOfTwo(int n) { return (n>0)&&((n&
阅读全文
摘要:思路: 哭了,我只想能想到循环,想到位运算也只能想到循环位移。 然后就去看题解了。 题解是使用 判断是否为2的幂的方法,又哭了,我不是写过这个题了吗...... 好吧,那这次就在巩固一次。 用的方法是定义一个常数 用16进制表示就为(0xaaaaaaaa),换成二进制0xa=1010,相当于我4的倍
阅读全文
摘要:思路: 这个题之前做过也写过博客了。 当时的方法是遇到(,就将res字符串存放的字符串放入栈中,遇到)说明一个层次的字符串已经找到,就将当前res的字符串反转,并将栈里的top取出放在原res字符串前面,然后继续遍历s,如果遇到字母就加入res,否则就继续上述步骤,直到遍历完s。之前写的 这次的话用
阅读全文
摘要:思路: 这个题目需要明确的是字符串最长公共前缀,所以如果存在这么的前缀,数组的每个字符串都有这样的前缀,有一个没有这样的前缀就返回空。所以难点是找存在这样的前缀,但要如何找出他最大的长度。 这里我是看到评论用python的特性,他能按照字符串的ASCII码进行排序,所以自己用C实现了一下。 C用so
阅读全文
摘要:思路: 这道题啊,直接通过取余数反转数再对比即可。 代码: class Solution { public: bool isPalindrome(int x) { if(x<0) return false; long a = x; long res = 0; while(a!=0){ res = r
阅读全文
摘要:思路: 虽然说简单题,但如果无法秒杀还是说明基础不好。那我还是太笨了,绕来绕去才找到的了正确方法。 就用一个cur,一个pre,一开始cur指向nullptr,pre指向head,然后进入循环,循环条件就是pre不为nullptr。然后我们需要建立一个临时变量temp存放pre->next。因为我们
阅读全文
摘要:思路: 为什么动规有些规律就是发现不了呢,叹气。 一开始想的方向就错了,想的是用出现次数最多的先打满,然后再用次数第二多的覆盖,在第三的覆盖,但发现如果字母出现的位置不连续就很难做,需要存储一个字母出现的所谓位置,这样就很难实现了。 然后看了题解,发现还是找规律。 首先我们可以发现 ,aba,aba
阅读全文
摘要:思路: 这个题可以在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
阅读全文

浙公网安备 33010602011771号