Skip to content

Commit 9334bae

Browse files
author
lucifer
committed
chore: 段落划分调整
1 parent c9514f5 commit 9334bae

File tree

1 file changed

+25
-19
lines changed

1 file changed

+25
-19
lines changed

thinkings/GCD.md

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
# 最大公约数
1+
# 我是如何用**最大公约数**秒杀算法题的
22

33
关于最大公约数有专门的研究。 而在 LeetCode 中虽然没有直接让你求解最大公约数的题目。但是却有一些间接需要你求解最大公约数的题目。
44

55
比如:
66

7-
- [914. 卡牌分组](https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/solution/python3-zui-da-gong-yue-shu-914-qia-pai-fen-zu-by-/)
8-
- [365. 水壶问题](https://leetcode-cn.com/problems/water-and-jug-problem/solution/bfszui-da-gong-yue-shu-by-fe-lucifer/)
9-
- [1071. 字符串的最大公因子](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/1071-zi-fu-chuan-de-zui-da-gong-yin-zi-zui-da-gong/)
7+
- [914. 卡牌分组](https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/solution/python3-zui-da-gong-yue-shu-914-qia-pai-fen-zu-by-/ "914. 卡牌分组")
8+
- [365. 水壶问题](https://leetcode-cn.com/problems/water-and-jug-problem/solution/bfszui-da-gong-yue-shu-by-fe-lucifer/ "365. 水壶问题")
9+
- [1071. 字符串的最大公因子](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/1071-zi-fu-chuan-de-zui-da-gong-yin-zi-zui-da-gong/ "1071. 字符串的最大公因子")
1010

1111
因此如何求解最大公约数就显得重要了。
1212

13-
## 定义法
13+
## 如何求最大公约数?
14+
15+
### 定义法
1416

1517
```python
1618
def GCD(a: int, b: int) -> int:
@@ -26,7 +28,7 @@ def GCD(a: int, b: int) -> int:
2628
- 时间复杂度:最好的情况是执行一次循环体,最坏的情况是循环到 smaller 为 1,因此总的时间复杂度为 $O(N)$,其中 N 为 a 和 b 中较小的数。
2729
- 空间复杂度:$O(1)$。
2830

29-
## 辗转相除法
31+
### 辗转相除法
3032

3133
如果我们需要计算 a 和 b 的最大公约数,运用辗转相除法的话。首先,我们先计算出 a 除以 b 的余数 c,把问题转化成求出 b 和 c 的最大公约数;然后计算出 b 除以 c 的余数 d,把问题转化成求出 c 和 d 的最大公约数;再然后计算出 c 除以 d 的余数 e,把问题转化成求出 d 和 e 的最大公约数。..... 以此类推,逐渐把两个较大整数之间的运算转化为两个较小整数之间的运算,直到两个数可以整除为止。
3234

@@ -40,6 +42,23 @@ def GCD(a: int, b: int) -> int:
4042
- 时间复杂度:$O(log(max(a, b)))$
4143
- 空间复杂度:空间复杂度取决于递归的深度,因此空间复杂度为 $O(log(max(a, b)))$
4244

45+
### 更相减损术
46+
47+
辗转相除法如果 a 和 b 都很大的时候,a % b 性能会较低。在中国,《九章算术》中提到了一种类似辗转相减法的 [更相减损术](https://zh.wikisource.org/wiki/%E4%B9%9D%E7%AB%A0%E7%AE%97%E8%A1%93#-.7BA.7Czh-hans:.E5.8D.B7.3Bzh-hant:.E5.8D.B7.7D-.E7.AC.AC.E4.B8.80.E3.80.80.E6.96.B9.E7.94.B0.E4.BB.A5.E5.BE.A1.E7.94.B0.E7.96.87.E7.95.8C.E5.9F.9F "更相减损术")。它的原理是:`两个正整数 a 和 b(a>b),它们的最大公约数等于 a-b 的差值 c 和较小数 b 的最大公约数。`
48+
49+
```python
50+
def GCD(a: int, b: int) -> int:
51+
if a == b:
52+
return a
53+
if a < b:
54+
return GCD(b - a, a)
55+
return GCD(a - b, b)
56+
```
57+
58+
上面的代码会报栈溢出。原因在于如果 a 和 b 相差比较大的话,递归次数会明显增加,要比辗转相除法递归深度增加很多,最坏时间复杂度为 O(max(a, b)))。这个时候我们可以将`辗转相除法``更相减损术`做一个结合,从而在各种情况都可以获得较好的性能。
59+
60+
## 形象化解释
61+
4362
下面我们对上面的过程进行一个表形象地讲解,实际上这也是教材里面的讲解方式,我只是照搬过来,增加一下自己的理解罢了。我们来通过一个例子来讲解:
4463

4564
假如我们有一块 1680 米 \* 640 米 的土地,我们希望讲起分成若干正方形的土地,且我们想让正方形土地的边长尽可能大,我们应该如何设计算法呢?
@@ -60,19 +79,6 @@ def GCD(a: int, b: int) -> int:
6079

6180
![](https://tva1.sinaimg.cn/large/007S8ZIlly1ghlujgvkvbj30aa04umx2.jpg)
6281

63-
辗转相除法如果 a 和 b 都很大的时候,a % b 性能会较低。在中国,《九章算术》中提到了一种类似辗转相减法的 [更相减损术](https://zh.wikisource.org/wiki/%E4%B9%9D%E7%AB%A0%E7%AE%97%E8%A1%93#-.7BA.7Czh-hans:.E5.8D.B7.3Bzh-hant:.E5.8D.B7.7D-.E7.AC.AC.E4.B8.80.E3.80.80.E6.96.B9.E7.94.B0.E4.BB.A5.E5.BE.A1.E7.94.B0.E7.96.87.E7.95.8C.E5.9F.9F "更相减损术")。它的原理是:`两个正整数 a 和 b(a>b),它们的最大公约数等于 a-b 的差值 c 和较小数 b 的最大公约数。`
64-
65-
```python
66-
def GCD(a: int, b: int) -> int:
67-
if a == b:
68-
return a
69-
if a < b:
70-
return GCD(b - a, a)
71-
return GCD(a - b, b)
72-
```
73-
74-
上面的代码会报栈溢出。原因在于如果 a 和 b 相差比较大的话,递归次数会明显增加,要比辗转相除法递归深度增加很多,最坏时间复杂度为 O(max(a, b)))。这个时候我们可以将`辗转相除法``更相减损术`做一个结合,从而在各种情况都可以获得较好的性能。
75-
7682
## 实例解析
7783

7884
### 题目描述

0 commit comments

Comments
 (0)