Skip to content

Commit 8d68d99

Browse files
committed
init workspace; finish intro
1 parent aa95b27 commit 8d68d99

File tree

3 files changed

+37
-22
lines changed

3 files changed

+37
-22
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# 说明
22

3+
zhs branch:
4+
这里将放zhs所有刷题的笔记,把之前的为知笔记按部分删除、放到这里。
5+
6+
不加注释,全都显式可见。
7+
8+
39
本项目为原项目 [algorithm-pattern](https://github.com/greyireland/algorithm-pattern) 的 Python3 语言实现版本,原项目使用 go 语言实现,目前已获 ![GitHub stars](https://img.shields.io/github/stars/greyireland/algorithm-pattern?style=social)。在原项目基础上,本项目添加了优先级队列,并查集,图相关算法等内容,基本覆盖了所有基础数据结构和算法,非常适合找工刷题的同学快速上手。以下为原项目 README,目录部分增加了本项目的新内容。
410

511
# 算法模板

introduction/python.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ Python语言有很多特性可以大大简化代码,下面列举几个常用
1717
Array = [0] * N
1818

1919
# 初始化一个形状为 MxN 的二维数组(矩阵)
20-
Matrix = [[0] * N for _ in range(M)] # 思考:可以写成 [[0] * N] * M 吗?
20+
Matrix = [[0] * N for _ in range(M)] # [[0] * N] * M的话,列上"牵一发而动全身"
2121
```
2222

2323
#### 交换元素值
@@ -60,10 +60,18 @@ Python 自带的 [bisect](https://docs.python.org/3/library/bisect.html) 库可
6060

6161
Python 中的栈使用自带的 list 类来实现,可参考[官方文档](https://docs.python.org/3/tutorial/datastructures.html#using-lists-as-stacks)
6262

63+
`s.append() s.pop()`足矣。
64+
6365
#### 队列
6466

6567
使用 collections 库中的 deque 类实现,可参考[官方文档](https://docs.python.org/3/library/collections.html#collections.deque)
6668

69+
```python
70+
q = deque(['a', 'b'])
71+
q.append('c')
72+
q.popleft() # 注意纯pop()还是默认从尾部
73+
```
74+
6775
####
6876

6977
Python 中没有真的 heap 类,实现堆是使用 list 类配合 heapq 库中的堆算法,且只支持最小堆,最大堆需要通过传入负的优先级来实现,可参考[官方文档](https://docs.python.org/3.8/library/heapq.html)
@@ -76,6 +84,8 @@ Python 中没有真的 heap 类,实现堆是使用 list 类配合 heapq 库中
7684

7785
Python 的 [collections 库](https://docs.python.org/3/library/collections.html)在刷题时会经常用到,它拓展了一些Python中基础的类,提供了更多功能,例如 defaultdict 可以预设字典中元素 value 的类型,自动提供初始化,Counter 可以直接统计元素出现个数等。
7886

87+
Counter最基本的功能就是初始值为0的defaultdict。
88+
7989
## 总结
8090

8191
以上列举了一些用 Python3 做算法题时可以用到的一些特性,标准算法和数据结构,总结得肯定不全,因为 Python3 真的有很多可以利用的"骚操作",大家在学习本项目的时候也会见到,一下记不住也没关系,多实战就会了。

introduction/quickstart.md

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
## 数据结构与算法
44

55
数据结构是一种数据的表现形式,如链表、二叉树、栈、队列等都是内存中一段数据表现的形式。
6-
算法是一种通用的解决问题的模板或者思路,大部分数据结构都有一套通用的算法模板,所以掌握这些通用的算法模板即可解决各种算法问题。
6+
7+
(套模板)
8+
算法是一种通用的解决问题的**模板**或者思路,大部分数据结构都有一套通用的算法模板,所以掌握这些通用的算法模板即可解决各种算法问题。
79

810
后面会分专题讲解各种数据结构、基本的算法模板、和一些高级算法模板,每一个专题都有一些经典练习题,完成所有练习的题后,你对数据结构和算法会有新的收获和体会。
911

@@ -18,61 +20,58 @@
1820
```Python
1921
class Solution:
2022
def strStr(self, haystack: str, needle: str) -> int:
21-
L, n = len(needle), len(haystack)
22-
23-
for start in range(n - L + 1):
24-
if haystack[start:start + L] == needle:
23+
len_h, len_n = len(haystack), len(needle)
24+
for start in range(len_h - len_n + 1):
25+
if haystack[start : start + len_n] == needle:
2526
return start
2627
return -1
2728
```
2829

29-
需要注意点
30+
needle为空,则两个空串比较,也返回正确的0。
3031

31-
- 循环时,i 不需要到 len-1
32-
- 如果找到目标字符串,len(needle) == j
32+
更高级的叫**KMP算法**,从O(m x n)提升到O(m + n)。暂时跳过。
3333

3434
### [示例 2:subsets](https://leetcode-cn.com/problems/subsets/)
3535

3636
> 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
3737
3838
- 思路:这是一个典型的应用回溯法的题目,简单来说就是穷尽所有可能性,算法模板如下
3939

40-
```go
40+
```python
4141
result = []
42-
func backtrack(选择列表,路径):
42+
def backtrack(选择列表, 路径):
4343
if 满足结束条件:
44-
result.add(路径)
44+
result.append(路径)
4545
return
4646
for 选择 in 选择列表:
4747
做选择
48-
backtrack(选择列表,路径)
48+
backtrack(新选择列表, 新路径)
4949
撤销选择
50+
return # 部分循环中,循环结束依然无解
5051
```
5152

5253
- 通过不停的选择,撤销选择,来穷尽所有可能性,最后将满足条件的结果返回。答案代码:
5354

5455
```Python
5556
class Solution:
5657
def subsets(self, nums: List[int]) -> List[List[int]]:
57-
58-
n = len(nums)
5958
result = []
60-
61-
def backtrack(start, k, route=[]):
59+
n = len(nums)
60+
61+
def backtrack(start, route, k):
6262
if len(route) == k:
6363
result.append(route.copy())
6464
return
6565

6666
for i in range(start, n):
6767
route.append(nums[i])
68-
backtrack(i + 1, k)
68+
backtrack(i + 1, route, k)
6969
route.pop()
70-
7170
return
72-
71+
7372
for k in range(n + 1):
74-
backtrack(0, k)
75-
73+
backtrack(0, [], k)
74+
7675
return result
7776
```
7877

0 commit comments

Comments
 (0)