- 代码主要由C/C++或者Go语言编写,少量python,部分题目为SQL或者shell脚本操作,可根据文件后缀判断;
- 全部代码解法均为时间最优解,在某些题的代码中,包含多个可AC方法,最终也只采用时间/空间最优解;
- 每个题单独创建以题名为命名的文件夹,内含有源码与单元测试代码,均通过测试;
- 某些题目未给出时间复杂度,其原因多在于存在回溯操作,难以正确估计实际时间复杂度;
- 若题目对空间复杂度有明确要求,例如O(1),所给代码均按照要求实现。
- 代码使用 C11 标准,构建工具使用 CMake ,推荐使用 Clion 作为IDE,导入工程目录为:leetcode/leetcode-c,已经配置好 CMakeLists.txt 脚本;
- 某些低版本编译器可能无法编译, 平台+编译器推荐组合如下:
- Linux(推荐):GCC 或 Clang
- Windows(可用):Visual Studio(MSVC) 16.8版本以上 + Windows 10 SDK (10.0.20348.0) 版本 2104 以上)
- macOS(可用):Apple Clang 或 GCC
- C单元测试采用 ThrowTheSwitch/Unity ,性能测试采用 sheredom/ubench.h,在CMake构建中会拉取最新源码,需要环境自带Git;
- 哈希表采用 uthash 项目中的uthash.h,在CMake构建中会拉取最新源码;
- 将检测编译器是否支持 AddressSanitizer 内存检查功能,若支持将启用。
- 代码使用 C++ 14 标准,构建工具使用 CMake ,推荐使用 Clion 作为IDE,导入工程目录为:leetcode/leetcode-cpp,已经配置好 CMakeLists.txt 脚本;
- 某些低版本编译器可能无法编译, 平台+编译器推荐组合如下:
- Linux(推荐):GCC 或 Clang
- Windows(可用):Visual Studio(MSVC) 16.8版本以上
- macOS(可用):Apple Clang 或 GCC
- C++单元测试采用 Google Test ,性能测试采用 Google Benchmark ,二者在CMake构建中会拉取最新源码,需要环境自带Git。
- 将检测编译器是否支持 AddressSanitizer 内存检查功能,若支持将启用。
- 使用mod管理包,推荐使用 Goland 作为IDE,导入工程目录为:leetcode/leetcode-go ;
- Golang自动化测试使用自带test命令,包括单元测试和性能测试。
- 基于 python3.6 及以上版本,推荐使用 Pycharm 作为IDE,导入工程目录为:leetcode/leetcode-python ;
- python单元测试采用标准库uniitest,也推荐使用pytest进行全量测试;
- SQL语法适用于MySQL数据库(版本8.0以上);
- 所有的SQL操作均在名为
leetcode
的数据库中进行。
- Shell 使用 Bash (Bourne Again shell)
- 37. Sudoku Solver 来自本人项目sudoku-solver,存在
DFS
和Dance Link X
两种解法,虽然DFS对简单数独(LeetCode测试样例)处理更快,但是Dance Link X在复杂数独的求解速度远远优于DFS,故采用后者。 - 76. Minimum Window Substring 若使用
HashMap
,在频繁调用时候性能欠佳,因题目给出key仅为英文字母,所以采用了固定数组来统计出现次数。 - 84. Largest Rectangle in Histogram 借助单调栈实现O(n) 算法,且已尽可能优化。但是测试样例存在bug ,即使使用提交页面提供的0ms代码,在当前测试样例下,至少也有80ms耗时,与本人结果一致,怀疑存在后期加入其他复杂测试样例。
- 89. Gray Code 已做到时间+空间最优解,运算全部位运算,不论golang还是C++都做不到0ms解或则最优空间解。
- 147. Insertion Sort List 要求在单链表上实现插入排序(时间复杂度:O(n^2),空间:O(1)),但为了在线评测中时间表现优异,添加了快速排序实现(时间复杂度:O(nlog(n)),空间:O(n))。
- 149. Max Points on a Line 有
三点枚举优化
和斜率HashMap
两种方法,前者在本地性能测试中总优于后者,但在线测试时前者耗时均多于后者。 - 172. Factorial Trailing Zeroes 要求统计阶乘末尾0的个数,解法是计算阶乘中质因子5的个数,时间复杂度O(log_5(n))。又因为数据范围小,通过循环展开,实现理论时间复杂度O(1)。
- 187. Repeated DNA Sequences 使用双
HashSet
来统计结果,因为key值过多,存在性能问题。 - 295. Find Median from Data Stream 使用双优先队列实现,已做尽可能优化逻辑,与提交页面最优解基本一致,但时间不能做到最快,怀疑后期加入复杂用例。
- 224. Basic Calculator 和 227. Basic Calculator II 解法来自本人项目str_expr_eval,实现:字符串表达式 → 中缀表达式 → 后缀表达式 → 求值 流程,由于更具泛用性,需要额外的线性时间处理和额外的线性空间记录中间值,难以实现时间和空间优势,但复杂度上不变。
- 1774. Closest Dessert Cost 存在DFS或则DP两种解法,后者在时间复杂度上更优,但由于本题数据量小,在极限数据上DFS方法耗时小于DP方法耗时,故采用DFS方法。
- 406. Queue Reconstruction by Height 插入操作可以使用线段树优化,待后续补充。