git链接
TVT第一季度不知道忙的个啥,写的太少了给我冲
166.分数到小数
1.查了下判断除尽的条件,一个思路:先判断是否是循环小数,如果是,则进行循环到重复一次,就可以得到循环节了。这个思路就需要 1)判断:是否可以除尽 2)寻找循环节
2.看了题解,我想多了,整数部分使用长除法解决,小数部分找循环节是核心。题解链接
3.写的第一版本有问题,并不是所有小数部分都是循环节,我直接看是否循环,然后将所有的小数部分弄成了循环节。
258.各位相加
1.这题本身没难度,进阶要求不使用递归和循环一时没想到。一看答案是个数学方法。题解链接
44.通配符匹配
1.对于匹配字串扫描,遇到a-z直接同步前进匹配,遇到应该是可以不停进直到匹配到。但是存在一些需要细致考虑的地方。例如“*b”可以匹配“abbb”,在扫描到第一个b不需要停止。而“*b?b”也可以匹配,但是要及时停止。何处停止就是个问题。这儿考虑可以利用回溯,亦或者直接分支并及时剪枝(写一个递归的算法),只要有一个匹配成功就继续。
2.直接看了题解了,1里说的方法肯定可行但是即便写出来估计也效率太差。参考下答案的动态规划和贪心做。
127.单词接龙
1.这题需要多次找到差一个字母的单词,从而得到一个序列。想着是把可以转换的连起来,连完后开始词到结束词可以连通就行。可以转成图联通问题,但是对于怎么转缺乏思路。
398.随机数索引
1.一个直接的思路是,构建数字到位置列表的字典,每次随即返回。
2.题解第一个方法与我的直观思路相同,另一种解法是水塘抽样。参见题解
6.z字变换
1.一眼看过去是个规律题,变换的位置是有对应的,当numRows为3时第一行的数对应位置是4n,中间是2n+1,下面是4n+2(从0开始计数)。第一行的位置通项公式为(2*numRows -2)*n,其它的具体推算就不写了。可以得知,模(2*numRows -2)的结果互补的数都在同一行。按这个规律可以分队拼接再组合
2.看了下题解,我和最优解思路一样,不过我的代码简洁些
sword-11-旋转数组的最小数字
1.和搜索旋转数组很像。二分查找的变式。参见题解
2,在left,right的变化上犯了错。因为整除2的原因,right至少要左移一个,所以right=med没问题。 如果left,right只差1,left可能会不移动,因此left每次要加一。把等于单独讨论,等于意味着,最小值在区间内,而且在最右边的更左一点
sword-20-表示数值的字符串
1.其实就是设计一个有限状态自动机
sword-21-调整数组顺序使奇数位于偶数前面
1.双指针
sword-22-链表中倒数第K个节点
1.快慢指针
sword-31-栈的压入、弹出序列
1.规律是,一个数如果已经出栈,那么它之前的数必须按照相对顺序在它之后出现
2.直接参考了题解,模拟真实的出入栈即可
sword-33-二叉搜索树的后序遍历序列
1.后序遍历的结果是左子树右子树根,根据这个规律,可以划分区间得到结果
sword-34-二叉树中和为某一值的路径
1.在本题上吃了大亏
- python传列表是引用,第一遍写没注意。而且返回了冗余的数据,设计失误
- 没有仔细读题,想当然觉得树上节点都是正数,想以此剪枝,反而做错了
2.还有BFS的方法:建好一个查父节点的字典parent,然后实际上就是一个层序遍历+额外存储节点对应的当前结果值,每次出队列都进行比较。直到找到根节点,再借助parent查询到路径上所有的数并加入结果
sword-35-复杂链表的复制
1.直观思路,过两遍,第一遍复制节点并生成一个链表,和原链表到目标链表的节点映射。第二遍扫描再修改random指针
2.题解给了两个方案,一个是回溯加hasn,仔细想一下的话会发现和我的方法没有实质的区别。不过回溯写起来短一些。
3。题解的第二个方案比较巧妙,先把复制出来的节点插在原节点后,这样一步走完后,random节点指向的节点的后一个就是复制的节点,。然后一共走三遍即可。
sword-38-字符串的排列
1.有直观思路,但我没写了,就是把字符串转列表,全排列再去重。我的习惯写法是传入复制的列表,这样的计算代价过大。
2.官方解第一种回溯。主要是考虑如何在填入数字时不重复。官解先给字符串排序,我直接使用字典解决了
3.官解第二种,利用排列,免去了去重的麻烦。
sword-39-数组中出现的最多次数的数
1.因为和主站169题相同,所以就试下写官解里的其他方法了。
sword-40-最小的K个数
1.实际上就是topK问题
sword-42-最大子数组和
1.可以用动态规划和分治,动态规划可以优化为常数空间复杂度
sword-44-数字序列中第n位的数
1.很明显是个规律题。n位数的个数,为9*10^(n-1),除了一位数特殊外,此外,n位之前的数的个数是10^(n-1)。由此可以大体算出第n位虽在的区间,再进一步找到数字就可以了
2.需要特别注意在代码的第14,15行的问题,判断剩下还有多少个数的时候,位数和个数的对应关系
sword-45-数字序列中第n位的数
1.首先,长度相同时字典序较小的字符串一定是倾向于优先排列的。对于长度不同时,一时没想好
2,看了题解,定义排序规则。字符串x和y,加法为拼接。如果x+y<y+x,则定义x<y,即x排在y之前
sword-46-把数字翻译成字符串
1.直观的读完题,递归一下即可。因为没要求返回翻译结果,都不用回溯
2.看了题解,可以以动态规划的视角去做。转化为青蛙跳台阶,只不过两步的时候可能没法跳。也是先转字符串再比较。一位数不用比,两位数才需要比
sword-47-礼物的最大价值
1.看到题目直接想到了利用回溯遍历全部路径即可
2.回溯复杂度太大,得用动态规划==。有思路之后挺简单的
sword-48-最长不含重复字符的子字符串
1.集合加双指针
sword-49-丑数
1.直接看了题解,分为最小堆发和动态规划法
sword-50-第一个只出现一次的字符
1.用hash两遍遍历可解。用字典一遍遍历也可,注意,python3.6后,字典默认有序。
sword-52-两个链表的第一个公共共节点
1.快慢指针
sword-53-1在排序数组中查找数字 I
1.过于简单
sword-53-2-n-1 中缺失的数字
1.直接写非常简单。但是可以优化
2.优化解法1:因为是排序数组,所以可以使用二分法
3..优化解法2:因为是排序的,所以下标应该等于值。第一个不符合的即可返回
4.这题其实有小细节的问题,对于特殊输入[0]的处理
sword-54-二叉搜索树的第k大节点
1.利用二叉树的中序遍历,然后建立一个大小为k的数组,遍历时,没装满时添加,装满后一边加一边删。最后数组的第一个就是需要的结果
sword-55-二叉的最大深度
1.递归或者迭代都行,迭代可以借助层序遍历,最多的层数就是深度
sword-55-2-二叉的最大深度
1.DFS莽起来
2.发现自己实际上写的就是自下向上递归,最优解
sword-56-1-数组中出现一次的两个数
1.题目要求常数空间复杂度,n时间复杂度。没想出来,但是肯定和异或有关
2.上题解
sword-56-2-数组中出现一次的一个数(其它三次)
1.暴力扫肯定是可以的,用字典扫一遍即可
2.更优方法,将所有数的二进制每位都加起来模3,得到的结果就是只出现一次的。而最终模3和一开始模没区别,在计算过程中就可以做了。这个方法很有意思!!
sword-57-两数之和
1.经典题了,leetcode主题库也有。一遍扫描即可
2,因为是排序数组,可以双指针
sword-57-2-和为s的连续正序列
1.这道题我首先考虑了可能的序列范围,首先,假设为n个,假设里面最小的数为a,那么总和就是 a*n + (n-1)n/2,n从2开始增大,计算这个式子的解,a最小为1,会知道n的范围。
2.n的范围没必要精确计算,当a取1时。n方加n为2倍target,直接开方得范围即可
3.没看题解了,我的方法优于最优解。
sword-58-1-翻转单词顺序
1.so easy
sword-58-2-翻转单词顺序
1.so easy
sword-59-2-最大队列
1.空间换时间得思路,问题在于,队列是先进先出,因此不能直接借鉴最小栈。
2。直接看题解吧,仔细思考题解二也不完全符合要求。但是思路很有意思。借助一个始终递减的队列来实现
sword-60-n个骰子点数和概率
1.一开始想用公式,发现公式很复杂,也很难转化为代码
2.看了题解,动态规划
sword-63-股票的最大利润
1.so easy
sword-64-求1+2+…+n
1.题目的限制条件头疼了。看题解吧
2.官方题解2得手动快速乘没看了
sword-62-圈圈最后剩下得数字
1.没看出规律,看了题解发现不是规律题,有一定技巧。约瑟夫环问题
sword-65-不用加减乘除做加法
1.肯定是做位运算了。对于某个二进制位,结果为异或值,进位为与值。
2,涉及补码,个人觉得有些难的
sword-66-构建乘积数组
1.因为不能使用除法的要求,不能使用先计算乘积再除以对应的数的办法了。
2.看了题解,从头遍历,相乘一次。再回头遍历,相乘一次,只要合理错开即可。见代码
sword-67-把字符串转换成整数
1.常规转换题,看了题解优化了我的写法
sword-68-1-二叉搜索树最近公共祖先
1.之前做过二叉树的最近公共祖先,考虑这道题,二叉搜索树的数据是有特征的。两个值的公共祖先的值一定在两者之间。可以作为一个剪枝的条件
2.看了题解的第二种,值得学习下。
sword-68-2-二叉树最近公共祖先
1.之前做过,用的不同方法。写一下hash表法
cracking-01-02-判断是否互为字符重排
1.最简单暴力的办法是把两个字符串都重排一下,比对是否相等
2.还可以利用hash表
cracking-01-03-URL化
1.不用现成函数,使用双指针。有更多效果更好做法,比如直接拼字符串,再范围内哦那个replace,感觉不符合题意没用
cracking-01-04-回文排列
1.是某个回文串的条件是,统计全部字符,最多有一个奇数出现,其它都是偶数个
2.看到了评论区提出的新奇解法,即用二进制位表示是否出现。
3.result & (result - 1) == 0的结果可以表示result里1的个数是否只有一个,只有一个因为借位的关系,1会错开。2个及以上用不完,就不等于0了
cracking-01-05-一次编辑
1.字符个数相差2个及以上就不行了,相差一个就得保证短的那个除了缺一个字符外其它和第一个完全相同,长度相同也是只差一个,遍历检查即可
cracking-01-06-字符串压缩
1.简单,冲
cracking-01-07-旋转矩阵
1.这题显然可以更具位置变化来进行迭代,计算一下位置对应的方式即可。(x,y)->(y,n-1-x),这个是旋转公式
704.二分查找
1.简单,冲了
704.第一个错误的版本
1.其实也是二分查找的变式,但是保持谨慎的点在于要找到真假的分界线。
2.参考了题解,在处理分界上没写对.因为不可能在左半部分,只有左半部分需要额外加一