Python中LeetCode上时间最短的Solution都用了哪些黑科技?

最简单的 Reverse String https://leetcode.com/problems/reverse-string/,我用了很多方法,最后还是发现 str[::-1] 时间最短, 64ms ,但是也只能超过 77%。

看了统计数据,不能理解 48ms 是如何做到的。有人知道吗?
Python中LeetCode上时间最短的Solution都用了哪些黑科技?


35 回复

有个毛的黑科技,别用这么高层的语言,用 C 写,4ms 都没问题


那些跑得最快的解法,核心就几点:

  1. 用对数据结构:比如找存在性用 set (O(1)查找),别用 list (O(n))。需要有序快速插入删除就用 bisectSortedList,别自己瞎排序。

  2. 避免不必要的操作:在循环里能提前算好的变量就别重复算,能用局部变量就别反复查字典或对象属性。字符串拼接用 ''.join(list) 而不是 +=

  3. 利用语言特性:像 collections.defaultdict, collections.Counter 这种内置工具比手动写字典逻辑快。列表推导式通常也比显式循环快一点。

  4. 数学和位运算:有些题用数学公式或位运算直接出结果,比模拟过程快几个数量级。比如判断奇偶用 n & 1, 乘除2用 << 1>> 1

  5. 选择最优算法:这是根本。比如该用双指针就别暴力嵌套循环,该用动态规划就别傻递归。时间复杂度降下来才是最大的“黑科技”。

总结:没那么多黑魔法,就是基础算法+数据结构+语言特性的极致利用。

我记得 LeetCode 服务器计时不稳定,相同的代码能差 50%,现在不知道还这样不

不是同一种语言之前相互比的嘛

哪里可以看到统计数据, 我怎么看不到?

[确实是这样(]

刷算法题就要用 c/cpp ,其他感觉锻炼价值不大。


你提交完通过的话会显示效率分布图的

golang 表示长期没有统计数据(

我听说有些可以猜测试用例。

赞同二楼,因为试过一段代码写的较烂,第一次提交 fail ,手抖再点了一下过了。

反对说刷题就要用 c/cpp 的。

上次黑 leetcode 发现判断结果是 stdout 判断的。于是就放弃了。

遇到一题说是求一个数的开平方根,我用 Java 的 Math.sqrt 居然直接过了…什么鬼…

这没什么问题吧

方差很大,参考价值不高。只要不是一直垫底就没太大问题

我也很好奇,有时删了几个无关变量,时间反而变长了。顺便提一句我是用 js 刷的,锻炼一下 js ,嘿嘿嘿

本来就不会检查你代码用了什么。。。我拿 c++ STL 的 std::sort 也过了。。。

刷 leetcode 正确的姿势是,
第一遍,最快速的写出一个 正确的
第二遍,自己优化自己的代码, 尽量的达到中上
第三遍,看讨论里最快的代码, 想想是为啥
第四遍, 试试能否更快

同样的算法,用 Py 写的能过,用 Golang 写的一直 TLE ,我也是醉了

go 不是很懂, 针对这题的话, O(n) 可以再压缩 成 O(n/2), 一般标准库的应该都是用的 O(n)
然后再压缩的话, 就是看是否有多余的运算, 比如 循环里 i < string.length / 2 可以优化 掉

这题 Java 竟然优化得比 C++都厉害了

居然不用 ptrace 进行统计

不是优化的厉害,是改了计时方式,把虚拟机启动时间忽略了

还有就是可能测试用例不一样,所以不同语言比较意义不大。

理论上, reverse string 标一个‘ reversed ’就行了, O(1)的。然后用的人反过来读就行…

直接 return new StringBuilder(s).reverse().toString(); // 4ms 逃

感觉的确是省了,提交比较早的答案和现在差的不少


感觉测试用例应该差不多少吧,我在想他们是不是提供了一些典型字符串字面值的测试用例

我之前刷的一些题目,要求如果是用 C 解决的话,空间要求是 O(1),所以一些题目的不同语言测试用例会有一些不同的。
还有就是之前知乎上面看别人说的(出处找不着了), C/C++的测试用例 size 可能会比起他语言的 size 大,如果是这种情况,那么比较速度其实不公平。

这个方面我倒是没想到

lc 的计时方差很多。提交三次,自己去个平均值好了。 99%那些一般也是 90%左右的 glitch

python 22 题 42ms

2F 果然是正解,我相同的代码一开始是 105ms,再运行一次就编程 75ms 了。

2019 年。。。现在还这样,
同样的代码,多提交几次,可以获得更短的执行时间

回到顶部