记录LeetCode的一些练习…
728.自除数
1 | class Solution: |
注意除数为0的可能,范围为1-10000
评论区再次秀到了我,面向用例编程
3.无重复字符的最长子串
拉垮了,自己写了个算法,check不过呢
1 | class Solution: |
正解:
这一题方法是方法是”滑动窗口”
1 | class Solution: |
用到了python内置函数,set()
94.二叉树中序遍历
自己写的根本通不过,虽然意思懂了……就不展示了
下面是参考其中一个题解的递归算法:
正解:
1 | # Definition for a binary tree node. |
后面附上陈斌老师关于python数据结构的二叉树的链表实现,及其前序中序后序的递归实现:
1 | class BinaryTree: |
把以前逆向关于二叉树遍历的题目拿出来,带入验证一下
100.相同的树
这题还是用的深度优先算法
- 如果两个节点都没有,那么肯定相同
- 如果两个节点只有一个有,那么肯定不同
- 比较完节点之后,开始比较节点的值,如果两个节点的值不相同,则两颗树是不同的。
- 后面就是bfs深度优先算法
1 | class Solution: |
这篇博客讲写树算法套路框架的:
112.路径总和
1 | # Definition for a binary tree node. |
这边还是递归,有两个限制
- 如果root为空,而且sum值还存在,则返回False
- 如果sum值正好等于当前节点的val值,且为根节点,则返回True
下面就是两个递归算法,返回值为left or right,满足一个条件为Ture即可。
113.路径总和(二)
1 | # Definition for a binary tree node. |
就是在上面的基础上,增加了append的功能
在dfs()算法的最后,需要加上pop()语句,用来回溯正确的值。
5.最长回文子串
1 | class Solution: |
自己编写的,可惜超时了,去评论区找找更好的解决方案:
对于暴力算法的改进……在第二重循环中优先判断长度,但还是超时
1 | class Solution: |
这边推荐使用中心扩散算法,循环字符串中的每一位个字符,并向字符两边扩散,如果两边字符都相当且不越界,则正确,返回left和right截取的字符串。
当然,也要考虑最长回文子串为偶数的情况,第二个if就是为其考虑的。
官方解题:
1 | class Solution: |
来源:
剑指 Offer 44. 数字序列中某一位的数字
自己代入的1009算的,但还是错了
1 | # 0-9 9 1位 |
正解:
1 | class Solution: |
还是大佬厉害啊,俺的做法跟他差不多,就是不知道哪里错了……
275.H 指数 II
1 | class Solution: |
会有各种稀奇古怪的组合,得面面俱到,就和修洞一样(doge)
我就是简单的测试了以下当前的值与列表后面值得个数,以及考虑到了一些特殊情况,这边的话,就不修了……
正解
这题最好使用的方法是二分查找:
1 | class Solution: |
当然看题解区也有遍历数组的解法,我和他的想法类似,就是我拉大跨罢了:
1 | class Solution: |
来源:https://leetcode-cn.com/problems/h-index-ii/solution/yi-ci-bian-li-ji-ke-by-qian-li-ma-8-liyt/
1089.复写零
和paixiaoxing讨论了这题,for循环不好控制,就用的是while循环。每次遇到0,都会把k再往后加一,并且pop最后一个列表元素,保证列表的长度不变。
1 | class Solution: |
1309.解码字母到整数映射
从后往前,遇到#,就把前面两个字符转换成整形,再转换成str型;如果没有遇到#,就正常ascii+48的转换。
第一次提交就全部通过,并且成绩还不赖!!
1 | class Solution: |
451.根据字符出现频率排序
自己编写,把所有可能出现的字符加入到字典中,然后循环字典统计字符出现次数,按照字典value排序,然后构建返回的flag,就是最后的思路,最后的循环可以再优化一下,
1 | class Solution: |
我惊了,人家可以用一行代码……
原来Counter可以直接统计列表或者字符中元素出现的次数
1 | from collections import Counter |
109. 有序链表转换二叉搜索树
在这边学习一下:快慢指针+链表分裂构造二叉树
1 | /** |
快慢链表节点用来确定链表中的中间节点,pre是确定中间节点的前一个节点,扫描出中间节点来作为二叉树根节点,然后是创建左右链表,并断开左右链表的链接,把左右链表的头节点放到递归函数中。
1207. 独一无二的出现次数
根据前天的Counter写出的算法,用set()去重,对比长度即知是否重复
1 | from collections import Counter |
有点拉
在评论区学到一招:
1 | Counter(arr).values() |
改进:
1 | from collections import Counter |
8.字符串转换整数 (atoi)
这题有点变态,不能忽视任何其他字符,会有正负数,会有科学计数法,而且不能超出范围。奇葩用例:
每次python的一行做法都能惊艳到我,大佬牛逼啊,传送门
让我诧异的是关于python中关于*的使用
大佬放话了:
也就是把只有一个元素的int列表转换成int,测试:
步骤:
先将字符串空格删除
re正则匹配,结果为列表类型
将匹配成功的列表”解包”
匹配成功的字符串,转换成int类型
min函数(XXX,2**31-1),确定上界限
max函数(XXX,-2**31),确定下界限
1 | import re |
^ 是不取的意思,[]是选择,?是出现一次或没有,\d+是出现一次或多次,\ +是因为+是特殊字符相当于转义