1、训练环境设置、编码技巧和 Code Style
⼯欲善其事,必先利其器
1)电脑设置
VSCode; Java: IntelliJ; Python: Pycharm
LeetCode plugin (VSCode & IntelliJ)
https://vscodethemes.com/
2)Code Style
默认空格习惯
3)LeetCode
leetcode-cn.com 和 题解 国内版看题解
leetcode.com 和 Discuss board 去掉-cn看国际版前三个
4)指法和⼩操作
• home, end(⾏头、⾏尾)
• Word 单词、选单词、选整⾏
• IDE 的⾃动补全
• Top tips for
5)⾃顶向下的编程⽅式
https://markhneedham.com/blog/2008/09/15/clean-code-book-review/
https://leetcode-cn.com/problems/valid-palindrome/
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvMzA2NjI2LzE1ODc3ODM1MTgyODYtYmQ0MDU3YTAtZmNhZi00YTk3LWEzOGYtMWExZDIyZjhkOTM0LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=343&margin=[object Object]&name=image.png&originHeight=685&originWidth=924&size=405251&status=done&style=none&width=462)
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvMzA2NjI2LzE1ODc3ODM0ODE0NTQtM2UxYjQyNjctNDQwMi00ZTBiLWJmM2UtNGViZmYzYTk3NWFiLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=321&margin=[object Object]&name=image.png&originHeight=642&originWidth=1561&size=362250&status=done&style=none&width=780.5)
2、时间复杂度、空间复杂度
Big O notation
O(1): Constant Complexity 常数复杂度
O(log n): Logarithmic Complexity 对数复杂度
O(n): Linear Complexity 线性时间复杂度
O(n^2): N square Complexity 平⽅
O(n^3): N square Complexity ⽴⽅
O(2^n): Exponential Growth 指数
O(n!): Factorial 阶乘
注意:只看最⾼复杂度的运算
Big O notation
O(1)
int n = 1000;
System.out.println("Hey - your input is: " + n);
O(1)
int n = 1000;
System.out.println("Hey - your input is: " + n);
System.out.println("Hmm… I’m doing more stuff with: " + n);
System.out.println("And more: " + n);
O(N)
for (int i = 1; i <= n; i++) {
System.out.println("Hey - I’m busy looking at: " + i);
}
O(N^2)
for (int i = 1; i <= n; i++) {
for (int j = 1; j <=n; j++) {
System.out.println("Hey - I’m busy looking at: " + i + " and " + j);
}
}
O(log(n))
for (int i = 1; i < n; i = i * 2) {
System.out.println("Hey - I’m busy looking at: " + i);
}
O(k^n)
int fib(int n) {
if (n <= 2) return n;
return fib(n - 1) + fib(n - 2);
}
时间复杂度曲线
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvMzA2NjI2LzE1ODc3OTUzNDMzOTMtODdhOWM5ODItZDQwNS00ZjAzLTgzNTYtMzA5MTI4MjA5Yjk5LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=352&margin=[object Object]&name=image.png&originHeight=703&originWidth=1065&size=154053&status=done&style=none&width=532.5)
实例
• ⽅法⼀:从1到n的循环累加
y = 0
for i = 1 to n:
y += i
• ⽅法⼆:求和公式 sum = n(n+1)/2
y = n * (n + 1) / 2
递归
Fib: 0, 1, 1, 2, 3, 5, 8, 13, 21, …
F(n)= F(n-1) + F(n-2)
面试(直接递归)
int fib(int n){
if (n <= 2) return n;
return fib(n-1) + fib(n-2);
}
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvMzA2NjI2LzE1ODc3OTU2MDk5ODgtOTE2NzNkMTMtZTk3My00ZDQyLTlmOWYtODI0MmY5YWRiMTc5LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=387&margin=[object Object]&name=image.png&originHeight=774&originWidth=1529&size=109106&status=done&style=none&width=764.5)
Master Theorem
![image.png](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvMzA2NjI2LzE1ODc3OTU2MjgwOTktMmM2OTZmYjMtZjg1Ni00NDQ1LWE5ZjQtNTNmNDBiMTQxYmE5LnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=147&margin=[object Object]&name=image.png&originHeight=294&originWidth=1194&size=153488&status=done&style=none&width=597)
思考题
⼆叉树遍历 - 前序、中序、后序:时间复杂度是多少?
图的遍历:时间复杂度是多少?
搜索算法:DFS、BFS 时间复杂度是多少?
⼆分查找:时间复杂度是多少?
⼆叉树遍历 - 前序、中序、后序:O(N)
图的遍历:O(N)
搜索算法:DFS、BFS - O(N)
⼆分查找:O(logN)
小结
• 常⽤⼯具配置
• 基本功和编程指法
• 常⻅的时间、空间复杂度