开启新的篇章,LeetCode上的腾讯精选50题。日刷已经完成22题。一周之内完成任务,加上汇总。压力应该不小。不过,没有那么多时间留给你。暂且定为6兔1龟。
题号 | 难易度 | |||||
---|---|---|---|---|---|---|
15 | 三数之和 | 48 | 23.0% | 中等 | ||
16 | 最接近的三数之和 | 20 | 41.1% | 中等 | ||
2 | 两数相加 | 139 | 34.6% | 中等 | ||
121 | 买卖股票的最佳时机 | 18 | 50.1% | 简单 | ||
1 | 122 | 买卖股票的最佳时机 II | 22 | 53.9% | 简单 | C |
18 | 124 | 二叉树中的最大路径和 | 12 | 35.9% | 困难 | |
70 | 爬楼梯 | 31 | 45.7% | 简单 | B- | |
11 | 盛最多水的容器 | 31 | 56.2% | 中等 | ||
2 | 217 | 存在重复元素 | 17 | 48.8% | 简单 | D |
3 | 237 | 删除链表中的节点 | 14 | 74.5% | 简单 | D |
4 | 89 | 格雷编码 | 14 | 64.7% | 中等 | B+ |
5* | 160 | 相交链表 | 17 | 44.6% | 简单 | B+ |
6 | 215 | 数组中的第K个最大元素 | 25 | 57.3% | 中等 | B |
7 | 230 | 二叉搜索树中第K小的元素 | 19 | 64.7% | 中等 | C+ |
8 | 146 | LRU缓存机制 | 16 | 41.4% | 中等 | A- |
9 | 141 | 环形链表 | 18 | 40.5% | 简单 | D |
10 | 142 | 环形链表 II | 13 | 40.8% | 中等 | C+ |
14 | 最长公共前缀 | 43 | 33.8% | 简单 | ||
5 | 最长回文子串 | 46 | 25.6% | 中等 | ||
16 | 235 | 二叉搜索树的最近公共祖先 | 19 | 59.6% | 简单 | C |
17 | 236 | 二叉树的最近公共祖先 | 12 | 55.3% | 中等 | C+ |
11* | 169 | 求众数 | 25 | 59.8% | 简单 | C |
15 | 104 | 二叉树的最大深度 | 31 | 69.5% | 简单 | D |
53 | 最大子序和 | 41 | 45.7% | 简单 | ||
4 | 寻找两个有序数组的中位数 | 55 | 35.3% | 困难 | ||
12 | 88 | 合并两个有序数组 | 39 | 44.4% | 简单 | C |
21 | 合并两个有序链表 | 41 | 55.3% | 简单 | ||
23 | 合并K个排序链表 | 18 | 46.7% | 困难 | ||
13 | 155 | 最小栈 | 20 | 49.0% | 简单 | C- |
14 | 43 | 字符串相乘 | 25 | 39.5% | 中等 | B+ |
292 | Nim 游戏 | 15 | 68.8% | 简单 | ||
9 | 回文数 | 71 | 56.2% | 简单 | ||
46 | 全排列 | 29 | 69.8% | 中等 | ||
19 | 231 | 2的幂 | 16 | 46.3% | 简单 | D |
20 | 238 | 除自身以外数组的乘积 | 12 | 61.3% | 中等 | C |
26 | 删除排序数组中的重复项 | 42 | 44.8% | 简单 | ||
7 | 整数反转 | 91 | 32.6% | 简单 | ||
21 | 206 | 反转链表 | 30 | 62.4% | 简单 | C- |
22 | 344 | 反转字符串 | 31 | 66.8% | 简单 | D- |
23 | 557 | 反转字符串中的单词 III | 23 | 66.0% | 简单 | D- |
24 | 61 | 旋转链表 | 16 | 38.6% | 中等 | C+ |
33 | 搜索旋转排序数组 | 30 | 36.6% | 中等 | ||
25 | 136 | 只出现一次的数字 | 28 | 61.7% | 简单 | D |
148 | 排序链表 | 11 | 60.8% | 中等 | ||
26* | 54 | 螺旋矩阵 | 27 | 36.2% | 中等 | A- |
27* | 59 | 螺旋矩阵 II | 23 | 73.3% | 中等 | A- |
8 | 字符串转换整数 (atoi) | 71 | 17.2% | 中等 | ||
28* | 78 | 子集 | 21 | 73.9% | 中等 | B |
62 | 不同路径 | 22 | 54.5% | 中等 | ||
20 | 有效的括号 | 67 | 38.7% | 简单 |
122.买卖股票的最佳时机 II 思考的时候注意,当天卖当天买无影响。只要后一天比前一天数大,就可以迭代买卖。巧用zip()
217 存在重复元素 巧用set()去掉重复字母,直接比较长度。
237 删除链表中的节点 最简单的链表操作
89 格雷编码 有几种做法,遍历,循环,还有公式法i ^ i >> 1 for i in range(1 << n)。复杂性和鲁棒性依次递减
160 相交链表 理解题意,相交点的选取。方法使用的是将两个链形头尾相接成闭环。链表1的长度是x1+y,链表2的长度是x2+y,我们同时遍历链表1和链表2,到达末尾时,再指向另一个链表。则当两链表走到相等的位置时:x1+y+x2 = x2+y+x1。没交点则y=0, 结尾都指向None。
215 数组中的第K个最大元素 几种思路:暴力法直接排序,冒泡,小堆根,introselect(简称“内省选择”)是一个选择算法是一个混合型的quickselect和中位数的中值,其具有快速的平均性能和最佳的最坏情况下的性能。这种方法不是很好理解。暂且搁置。快排变形。
230 二叉搜索树中第K小的元素 开始接触二叉树的题,需要开个专题练习一下。常规方法是中序遍历。巧解是使用迭代器。chain 函数可以组合多个迭代器,islice 函数对迭代器做切片操作。
146 LRU缓存机制 哈希+双向链表。
扩展一下:self.od = collections.OrderedDict()
141 环形链表 哈希法和快慢指针。比较基础的一道环链题。
142 环形链表 II 哈希直接法,还是没什么变化。快慢指针使用了数学法,根据路径替换。
169 求众数 平易近人的一道题啊。很简单,官方解答方法很多。可以着重研究一下。
88 合并两个有序数组 使用方法:合并后排序,或者使用双指针从后往前。
注意问题:
我觉得这里的 Python 代码不应该使用切片操作,因为切片操作会导致列表拷贝,空间复杂度就不再是 O(1) 了。PS:尽管列表切片操作拷贝的只是列表中的对象的引用(也就是地址),并不拷贝对象本身,但通常一个引用/地址也会占用 4 或 8 个字节,相当于一个 int 或 double 类型,这部分空间占用是无法忽略的。
155 最小栈 借用一个辅助栈,来存储stack中最小值。
43 字符串相乘 模拟竖式乘法,将结果加一起。有大神使用快速数论变换(NTT)完全不懂。先搁置一下吧。
收获:ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了你的 Python 定义范围,则会引发一个 TypeError 的异常。
lstrip() 方法用于截掉字符串左边的空格或指定字符。
104 二叉树的最大深度 两种方法,递归法和迭代法。很简单的二叉树问题。
235 二叉搜索树的最近公共祖先 同样可以使用递归和迭代。
学习一下,同号判断和比较判断。
1
2
3 > while (root.val - p.val) * (root.val - q.val) > 0:
> root = (root.left, root.right)[p.val > root.val]
>
236 二叉树的最近公共祖先
map() 会根据提供的函数对指定序列做映射。
124 二叉树中的最大路径和 有了前面的铺垫,还是没什么问题的。路径就是左右返回加上根节点。判断路径如果<0时,直接返回0.
float(‘-inf’)无穷小
231 2的幂
1 | return n > 0 and n & n - 1 == 0 |
238 除自身以外数组的乘积 不可以用除法,有时间要求。使用的是计算矩阵的上三角和下三角,并且在计算过程中储存过程值,最终可以在遍历2遍nums下完成结果计算。
206 反转链表 比较常规的一道题。首先还是考虑,递归或者迭代。
- 此解法为尾递归,即直接以递归返回值作为结果,一般编译器会做优化,避免多余的函数开栈操作,实现效果相当于迭代
344 反转字符串 双指针,直接交换即可。感动。 还有一个内置反向递归。reverse()
1
2
3 > for i in range(int(len(s)/2)):
> s[i], s[-i-1] = s[-i-1], s[i] #这种首位交换方式的表达方法值得学习一下。
>
557 反转字符串中的单词 III 两次[::-1]。一次分割换位,再一次整体字母换位。
61 旋转链表 k %= length + 1 关键点,就是拼接成环,找到断点。首尾相接,断点尾部指向None。
136 只出现一次的数字 最优解: 二进制异或,直接排除相同元素。
54 螺旋矩阵 常规做法需要耐心再看一遍。极简做法,感觉很棒~
59 螺旋矩阵 II 只是上一题的变形。其他上同。
78 子集 不错的一道题,适合细心钻研一下。多种解法。
1
2
3
4 > 调库排列组合
> from itertools import combinations
> return sum([list(combinations(nums, i)) for i in range(len(nums) + 1)], [])
>
一轮兔刷已经完毕,又几道题需要细心琢磨一下。更详细的总结。