mirror of
https://github.com/SunnyQjm/algorithm-review.git
synced 2026-06-03 08:16:43 +08:00
update
This commit is contained in:
+55
-55
@@ -6,63 +6,63 @@
|
|||||||
|
|
||||||
- **定义:**
|
- **定义:**
|
||||||
|
|
||||||
设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若存在正数 $c$ 和 $n_0$ ,使得对于一切 $n > n_0$ 有 $0 \le f(n) \le cg(n)$** 成立,则称 **$f(n)$ 的渐进上界是 $g(n)$**,记作:
|
设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若存在正数 $c$ 和 $n_0$ ,使得对于一切 $n > n_0$ 有 $0 \le f (n) \le cg(n)$** 成立,则称 **$f (n)$ 的渐进上界是 $g(n)$**,记作:
|
||||||
|
|
||||||
$f(n) = O(g(n))$
|
$f (n) = O(g(n))$
|
||||||
|
|
||||||
> [自然数]([https://baike.baidu.com/item/%E8%87%AA%E7%84%B6%E6%95%B0/385394?fr=aladdin](https://baike.baidu.com/item/自然数/385394?fr=aladdin)):自然数是指用以计量事物的件数或表示事物次序的数。即用数码0,1,2,[3](https://baike.baidu.com/item/3/5833),4……所表示的数。自然数由0开始,一个接一个,组成一个无穷的集体。自然数有有序性,无限性。分为偶数和奇数,合数和质数等。
|
> [自然数]([https://baike.baidu.com/item/%E8%87%AA%E7%84%B6%E6%95%B0/385394?fr=aladdin](https://baike.baidu.com/item/自然数/385394?fr=aladdin)):自然数是指用以计量事物的件数或表示事物次序的数。即用数码0,1,2,[3](https://baike.baidu.com/item/3/5833),4……所表示的数。自然数由0开始,一个接一个,组成一个无穷的集体。自然数有有序性,无限性。分为偶数和奇数,合数和质数等。
|
||||||
|
|
||||||
- **说明:**
|
- **说明:**
|
||||||
|
|
||||||
- $f(n) = O(g(n))$,$f(n)$ 的阶不高于 $g(n)$ 的阶;
|
- $f (n) = O(g(n))$,$f (n)$ 的阶不高于 $g(n)$ 的阶;
|
||||||
- 可能存在多个正数 $c$ ,只要指出一个即可;
|
- 可能存在多个正数 $c$ ,只要指出一个即可;
|
||||||
- 对前面有限多个值可以不满足不等式;
|
- 对前面有限多个值可以不满足不等式;
|
||||||
- 常数函数可以写作 $O(1)$
|
- 常数函数可以写作 $O(1)$
|
||||||
|
|
||||||
- **栗子:**
|
- **栗子:**
|
||||||
设 $f(n) = n^2 + n$,则:
|
设 $f (n) = n^2 + n$,则:
|
||||||
|
|
||||||
- $f(n) = O(n^2)$,取 $c = 2, n_0 = 1$ 即可;
|
- $f (n) = O(n^2)$,取 $c = 2, n_0 = 1$ 即可;
|
||||||
- $f(n) = O(n^3)$,取 $c = 1, n_0 = 2$ 即可;
|
- $f (n) = O(n^3)$,取 $c = 1, n_0 = 2$ 即可;
|
||||||
|
|
||||||
### 1.2 大 $\Omega$ 符号
|
### 1.2 大 $\Omega$ 符号
|
||||||
|
|
||||||
- **定义:**
|
- **定义:**
|
||||||
|
|
||||||
设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若存在正数 $c$ 和 $n_0$ ,使得对于一切 $n > n_0$ 有 $0 \le cg(n) \le f(n)$** 成立,则称 **$f(n)$ 的渐进下界是 $g(n)$**,记作:
|
设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若存在正数 $c$ 和 $n_0$ ,使得对于一切 $n > n_0$ 有 $0 \le cg(n) \le f (n)$** 成立,则称 **$f (n)$ 的渐进下界是 $g(n)$**,记作:
|
||||||
|
|
||||||
$f(n) = \Omega(g(n))$
|
$f (n) = \Omega(g(n))$
|
||||||
|
|
||||||
- **说明:**
|
- **说明:**
|
||||||
|
|
||||||
- $f(n) = \Omega(g(n))$,$f(n)$ 的阶不低于 $g(n)$ 的阶;
|
- $f (n) = \Omega(g(n))$,$f (n)$ 的阶不低于 $g(n)$ 的阶;
|
||||||
- 可能存在多个正数 $c$ ,只要指出一个即可;
|
- 可能存在多个正数 $c$ ,只要指出一个即可;
|
||||||
- 对前面有限多个值可以不满足不等式;
|
- 对前面有限多个值可以不满足不等式;
|
||||||
|
|
||||||
- **栗子:**
|
- **栗子:**
|
||||||
|
|
||||||
设 $f(n) = n^2 + n$,则:
|
设 $f (n) = n^2 + n$,则:
|
||||||
|
|
||||||
- $f(n) = \Omega(n^2)$,取 $c = 1, n_0 = 1$ 即可;
|
- $f (n) = \Omega(n^2)$,取 $c = 1, n_0 = 1$ 即可;
|
||||||
- $f(n) = \Omega(100n)$,取 $c = \frac{1}{100}, n_0 = 1$ 即可;
|
- $f (n) = \Omega(100n)$,取 $c = \frac{1}{100}, n_0 = 1$ 即可;
|
||||||
|
|
||||||
### 1.3 小 $o$ 符号
|
### 1.3 小 $o$ 符号
|
||||||
|
|
||||||
- **定义:**
|
- **定义:**
|
||||||
|
|
||||||
设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若对于任意正数 $c$ 都存在 $n_0$**,**使得对于一切 $n > n_0$ 有 $0 \le f(n) \le cg(n)$** 成立,则记作:
|
设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若对于任意正数 $c$ 都存在 $n_0$**,**使得对于一切 $n > n_0$ 有 $0 \le f (n) \le cg(n)$** 成立,则记作:
|
||||||
|
|
||||||
$f(n) = o(g(n))$
|
$f (n) = o(g(n))$
|
||||||
|
|
||||||
- **说明:**
|
- **说明:**
|
||||||
|
|
||||||
- $f(n) = o(g(n))$,$f(n)$ 的阶低于 $g(n)$ 的阶;
|
- $f (n) = o(g(n))$,$f (n)$ 的阶低于 $g(n)$ 的阶;
|
||||||
- 对不同的正数 $c$,$n_0$ 不一样,$c$ 越小 $n_0$ 越大;
|
- 对不同的正数 $c$,$n_0$ 不一样,$c$ 越小 $n_0$ 越大;
|
||||||
- 对前面有限多个值可以不满足不等式;
|
- 对前面有限多个值可以不满足不等式;
|
||||||
|
|
||||||
- **栗子:**
|
- **栗子:**
|
||||||
|
|
||||||
设 $f(n) = n^2 + n$,则:$f(n) = o(n^3)$
|
设 $f (n) = n^2 + n$,则:$f (n) = o(n^3)$
|
||||||
|
|
||||||
证:
|
证:
|
||||||
|
|
||||||
@@ -78,13 +78,13 @@
|
|||||||
|
|
||||||
- **定义:**
|
- **定义:**
|
||||||
|
|
||||||
设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若对于任意正数 $c$ 都存在 $n_0$**,**使得对于一切 $n > n_0$ 有 $0 \le cg(n) \le f(n) $** 成立,则记作:
|
设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若对于任意正数 $c$ 都存在 $n_0$**,**使得对于一切 $n > n_0$ 有 $0 \le cg(n) \le f (n) $** 成立,则记作:
|
||||||
|
|
||||||
$f(n) = \omega(g(n))$
|
$f (n) = \omega(g(n))$
|
||||||
|
|
||||||
- **说明:**
|
- **说明:**
|
||||||
|
|
||||||
- $f(n) = o(g(n))$,$f(n)$ 的阶高于 $g(n)$ 的阶;
|
- $f (n) = o(g(n))$,$f (n)$ 的阶高于 $g(n)$ 的阶;
|
||||||
- 对不同的正数 $c$,$n_0$ 不一样,$c$ 越小 $n_0$ 越大;
|
- 对不同的正数 $c$,$n_0$ 不一样,$c$ 越小 $n_0$ 越大;
|
||||||
- 对前面有限多个值可以不满足不等式;
|
- 对前面有限多个值可以不满足不等式;
|
||||||
|
|
||||||
@@ -92,22 +92,22 @@
|
|||||||
|
|
||||||
- **定义:**
|
- **定义:**
|
||||||
|
|
||||||
若 $f(n) = O(g(n))$ 且 $f(n) = \Omega(g(n))$,则记作:
|
若 $f (n) = O(g(n))$ 且 $f (n) = \Omega(g(n))$,则记作:
|
||||||
|
|
||||||
$f(n) = \Theta(g(n))$
|
$f (n) = \Theta(g(n))$
|
||||||
|
|
||||||
- **说明:**
|
- **说明:**
|
||||||
|
|
||||||
- $f(n)$ 的阶与 $g(n)$ 的阶相同
|
- $f (n)$ 的阶与 $g(n)$ 的阶相同
|
||||||
- 对前面有限多个值可以不满足条件;
|
- 对前面有限多个值可以不满足条件;
|
||||||
|
|
||||||
| | 定义 | 说明 |
|
| | 定义 | 说明 |
|
||||||
| :------: | :----------------------------------------------------------: | :----------------------------------------------------------: |
|
| :------: | :----------------------------------------------------------: | :----------------------------------------------------------: |
|
||||||
| $O$ | 设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若存在正数 $c$ 和 $n_0$ ,使得对于一切 $n > n_0$ 有 $0 \le f(n) \le cg(n)$** 成立,则称 **$f(n)$ 的渐进上界是 $g(n)$**,记作:$f(n) = O(g(n))$ | $f(n) = O(g(n))$,$f(n)$ 的阶不高于 $g(n)$ 的阶; 可能存在多个正数 $c$ ,只要指出一个即可; 对前面有限多个值可以不满足不等式; 常数函数可以写作 $O(1)$ |
|
| $O$ | 设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若存在正数 $c$ 和 $n_0$ ,使得对于一切 $n > n_0$ 有 $0 \le f (n) \le cg(n)$** 成立,则称 **$f (n)$ 的渐进上界是 $g(n)$**,记作:$f (n) = O(g(n))$ | $f (n) = O(g(n))$,$f (n)$ 的阶不高于 $g(n)$ 的阶; 可能存在多个正数 $c$ ,只要指出一个即可; 对前面有限多个值可以不满足不等式; 常数函数可以写作 $O(1)$ |
|
||||||
| $\Omega$ | 设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若存在正数 $c$ 和 $n_0$ ,使得对于一切 $n > n_0$ 有 $0 \le cg(n) \le f(n)$** 成立,则称 **$f(n)$ 的渐进下界是 $g(n)$**,记作:$f(n) = \Omega(g(n))$ | $f(n) = \Omega(g(n))$,$f(n)$ 的阶不低于 $g(n)$ 的阶; 可能存在多个正数 $c$ ,只要指出一个即可; 对前面有限多个值可以不满足不等式; |
|
| $\Omega$ | 设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若存在正数 $c$ 和 $n_0$ ,使得对于一切 $n > n_0$ 有 $0 \le cg(n) \le f (n)$** 成立,则称 **$f (n)$ 的渐进下界是 $g(n)$**,记作:$f (n) = \Omega(g(n))$ | $f (n) = \Omega(g(n))$,$f (n)$ 的阶不低于 $g(n)$ 的阶; 可能存在多个正数 $c$ ,只要指出一个即可; 对前面有限多个值可以不满足不等式; |
|
||||||
| $o$ | 设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若对于任意正数 $c$ 都存在 $n_0$**,**使得对于一切 $n > n_0$ 有 $0 \le f(n) \le cg(n)$** 成立,则记作:$f(n) = o(g(n))$ | $f(n) = o(g(n))$,$f(n)$ 的阶低于 $g(n)$ 的阶; 对不同的正数 $c$,$n_0$ 不一样,$c$ 越小 $n_0$ 越大; 对前面有限多个值可以不满足不等式; |
|
| $o$ | 设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若对于任意正数 $c$ 都存在 $n_0$**,**使得对于一切 $n > n_0$ 有 $0 \le f (n) \le cg(n)$** 成立,则记作:$f (n) = o(g(n))$ | $f (n) = o(g(n))$,$f (n)$ 的阶低于 $g(n)$ 的阶; 对不同的正数 $c$,$n_0$ 不一样,$c$ 越小 $n_0$ 越大; 对前面有限多个值可以不满足不等式; |
|
||||||
| $\omega$ | 设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若对于任意正数 $c$ 都存在 $n_0$**,**使得对于一切 $n > n_0$ 有 $0 \le cg(n) \le f(n) $** 成立,则记作:$f(n) = \omega(g(n))$ | $f(n) = o(g(n))$,$f(n)$ 的阶高于 $g(n)$ 的阶; 对不同的正数 $c$,$n_0$ 不一样,$c$ 越小 $n_0$ 越大; 对前面有限多个值可以不满足不等式; |
|
| $\omega$ | 设 $f$ 和 $g$ 是定义域为自然数集N上的函数。**若对于任意正数 $c$ 都存在 $n_0$**,**使得对于一切 $n > n_0$ 有 $0 \le cg(n) \le f (n) $** 成立,则记作:$f (n) = \omega(g(n))$ | $f (n) = o(g(n))$,$f (n)$ 的阶高于 $g(n)$ 的阶; 对不同的正数 $c$,$n_0$ 不一样,$c$ 越小 $n_0$ 越大; 对前面有限多个值可以不满足不等式; |
|
||||||
| $\Theta$ | 若 $f(n) = O(g(n))$ 且 $f(n) = \Omega(g(n))$,则记作:$f(n) = \Theta(g(n))$ | $f(n)$ 的阶与 $g(n)$ 的阶相同 对前面有限多个值可以不满足条件; |
|
| $\Theta$ | 若 $f (n) = O(g(n))$ 且 $f (n) = \Omega(g(n))$,则记作:$f (n) = \Theta(g(n))$ | $f (n)$ 的阶与 $g(n)$ 的阶相同 对前面有限多个值可以不满足条件; |
|
||||||
|
|
||||||
## 2. 函数渐进界的定理
|
## 2. 函数渐进界的定理
|
||||||
|
|
||||||
@@ -117,27 +117,27 @@
|
|||||||
|
|
||||||
设 $f$ 和 $g$ 是定义域为自然数集合的函数。
|
设 $f$ 和 $g$ 是定义域为自然数集合的函数。
|
||||||
|
|
||||||
- 如果 $\lim_{n \to \infty}\frac{f(n)}{g(n)}$ 存在,并且等于某个常数 $c > 0$ ,那么:
|
- 如果 $\lim_{n \to \infty}\frac{f (n)}{g(n)}$ 存在,并且等于某个常数 $c > 0$ ,那么:
|
||||||
|
|
||||||
$f(n) = \Theta(g(n))$
|
$f (n) = \Theta(g(n))$
|
||||||
|
|
||||||
- 如果 $\lim_{n \to \infty}\frac{f(n)}{g(n)} = 0$ ,那么:
|
- 如果 $\lim_{n \to \infty}\frac{f (n)}{g(n)} = 0$ ,那么:
|
||||||
|
|
||||||
$f(n) = o(g(n))$
|
$f (n) = o(g(n))$
|
||||||
|
|
||||||
- 如果 $\lim_{n \to \infty}\frac{f(n)}{g(n)} = +\infty$ ,那么:
|
- 如果 $\lim_{n \to \infty}\frac{f (n)}{g(n)} = +\infty$ ,那么:
|
||||||
|
|
||||||
$f(n) = \omega(g(n))$
|
$f (n) = \omega(g(n))$
|
||||||
|
|
||||||
- **栗子:**
|
- **栗子:**
|
||||||
|
|
||||||
设 $f(n) = \frac{1}{2}n^2 - 3n$,证明 $f(n) = \Theta(n^2)$
|
设 $f (n) = \frac{1}{2}n^2 - 3n$,证明 $f (n) = \Theta(n^2)$
|
||||||
|
|
||||||
证:因为
|
证:因为
|
||||||
|
|
||||||
$\lim_{n \to \infty}\frac{f(n)}{n^2} = \lim_{n \to \infty}\frac{\frac{1}{2}n^2 - 3n}{n^2} = \frac{1}{2}$
|
$\lim_{n \to \infty}\frac{f (n)}{n^2} = \lim_{n \to \infty}\frac{\frac{1}{2}n^2 - 3n}{n^2} = \frac{1}{2}$
|
||||||
|
|
||||||
根据定理1,有 $f(n) = \Theta(n^2)$
|
根据定理1,有 $f (n) = \Theta(n^2)$
|
||||||
|
|
||||||
- **根据定理1,得到的一些重要的结论:**
|
- **根据定理1,得到的一些重要的结论:**
|
||||||
|
|
||||||
@@ -282,11 +282,11 @@ $A(n) = \left \lfloor \log n \right \rfloor + \frac{1}{2}$
|
|||||||
|
|
||||||
- **主定理的应用背景:**
|
- **主定理的应用背景:**
|
||||||
|
|
||||||
$T(n) = aT(\frac{n}{b}) + f(n)$
|
$T(n) = aT(\frac{n}{b}) + f (n)$
|
||||||
|
|
||||||
- $a$ :规约后的子问题个数
|
- $a$ :规约后的子问题个数
|
||||||
- $\frac{n}{b} $ :规约后子问题的规模
|
- $\frac{n}{b} $ :规约后子问题的规模
|
||||||
- $f(n)$ :规约过程以及组合子问题的解的工作量
|
- $f (n)$ :规约过程以及组合子问题的解的工作量
|
||||||
|
|
||||||
二分检索 => $T(n) = T(\frac{n}{2}) + 1$
|
二分检索 => $T(n) = T(\frac{n}{2}) + 1$
|
||||||
|
|
||||||
@@ -294,19 +294,19 @@ $A(n) = \left \lfloor \log n \right \rfloor + \frac{1}{2}$
|
|||||||
|
|
||||||
- **主定理:**
|
- **主定理:**
|
||||||
|
|
||||||
设 $a > 1, b > 1$ 为常数,$f(n)$ 为函数,$T(n)$ 为非负整数,且 $T(n) = aT(\frac{n}{b}) + f(n)$,则:
|
设 $a > 1, b > 1$ 为常数,$f (n)$ 为函数,$T(n)$ 为非负整数,且 $T(n) = aT(\frac{n}{b}) + f (n)$,则:
|
||||||
|
|
||||||
1. 若 $f(n) = O(n^{log_b a - \epsilon})$,$\epsilon > 0$ ,那么:
|
1. 若 $f (n) = O(n^{log_b a - \epsilon})$,$\epsilon > 0$ ,那么:
|
||||||
|
|
||||||
$T(n) = \Theta(n^{\log_b a})$
|
$T(n) = \Theta(n^{\log_b a})$
|
||||||
|
|
||||||
2. 若 $f(n) = \Theta(n^{log_b a})$,那么:
|
2. 若 $f (n) = \Theta(n^{log_b a})$,那么:
|
||||||
|
|
||||||
$T(n) = \Theta(n^{\log_b a}\log n)$
|
$T(n) = \Theta(n^{\log_b a}\log n)$
|
||||||
|
|
||||||
3. 若 $f(n) = \Omega(n^{\log_b a + \epsilon})$,$\epsilon > 0$,且对于某个常数 $c < 1$ 和充分大的 $n$ 有 $af(\frac{n}{b}) \le cf(n)$,那么:
|
3. 若 $f (n) = \Omega(n^{\log_b a + \epsilon})$,$\epsilon > 0$,且对于某个常数 $c < 1$ 和充分大的 $n$ 有 $af(\frac{n}{b}) \le cf (n)$,那么:
|
||||||
|
|
||||||
$T(n) = \Theta(f(n))$
|
$T(n) = \Theta(f (n))$
|
||||||
|
|
||||||
- **例1:**
|
- **例1:**
|
||||||
|
|
||||||
@@ -314,9 +314,9 @@ $A(n) = \left \lfloor \log n \right \rfloor + \frac{1}{2}$
|
|||||||
|
|
||||||
解:
|
解:
|
||||||
|
|
||||||
$a = 9, b = 3, f(n) = n$
|
$a = 9, b = 3, f (n) = n$
|
||||||
|
|
||||||
$n^{\log_b a} = n^{log_3 9} = n^2$,$f(n) = O(n^{log_3 9 - 1})$
|
$n^{\log_b a} = n^{log_3 9} = n^2$,$f (n) = O(n^{log_3 9 - 1})$
|
||||||
|
|
||||||
根据主定理规则1,其中 $\epsilon = 1$:
|
根据主定理规则1,其中 $\epsilon = 1$:
|
||||||
|
|
||||||
@@ -328,9 +328,9 @@ $A(n) = \left \lfloor \log n \right \rfloor + \frac{1}{2}$
|
|||||||
|
|
||||||
解:
|
解:
|
||||||
|
|
||||||
$a = 1, b = \frac{3}{2}, f(n) = 1$
|
$a = 1, b = \frac{3}{2}, f (n) = 1$
|
||||||
|
|
||||||
$n^{log_b a} = n^{log_{\frac{3}{2}} 1} = 1$ ,$f(n) = n^{log_{\frac{3}{2}}1}$
|
$n^{log_b a} = n^{log_{\frac{3}{2}} 1} = 1$ ,$f (n) = n^{log_{\frac{3}{2}}1}$
|
||||||
|
|
||||||
根据主定理规则2:
|
根据主定理规则2:
|
||||||
|
|
||||||
@@ -342,19 +342,19 @@ $A(n) = \left \lfloor \log n \right \rfloor + \frac{1}{2}$
|
|||||||
|
|
||||||
解:
|
解:
|
||||||
|
|
||||||
$a = 3, b = 4, f(n) = n\log n$
|
$a = 3, b = 4, f (n) = n\log n$
|
||||||
|
|
||||||
$n^{\log_b a} = n^{\log_4 3} \approx 0.793$
|
$n^{\log_b a} = n^{\log_4 3} \approx 0.793$
|
||||||
|
|
||||||
取 $\epsilon = 0.2$,则 $f(n) = n\log n = \Omega(n^{\log_4 3 + 0.2})$ = $\Omega(n^{0.993})$
|
取 $\epsilon = 0.2$,则 $f (n) = n\log n = \Omega(n^{\log_4 3 + 0.2})$ = $\Omega(n^{0.993})$
|
||||||
|
|
||||||
条件验证:要使 $af(\frac{n}{b}) \le cf(n)$ 成立,带入 $f(n) = n\log n$ 得到:
|
条件验证:要使 $af(\frac{n}{b}) \le cf (n)$ 成立,带入 $f (n) = n\log n$ 得到:
|
||||||
|
|
||||||
$3(\frac{n}{4})\log (\frac{n}{4}) \le cn\log n$
|
$3(\frac{n}{4})\log (\frac{n}{4}) \le cn\log n$
|
||||||
|
|
||||||
当 $c \ge \frac{3}{4}$ 时,上述不等式可以对充分打的n成立,根据主定理规则3:
|
当 $c \ge \frac{3}{4}$ 时,上述不等式可以对充分打的n成立,根据主定理规则3:
|
||||||
|
|
||||||
$T(n) = \Theta(f(n)) = \Theta(n\log n)$
|
$T(n) = \Theta(f (n)) = \Theta(n\log n)$
|
||||||
|
|
||||||
- **二分检索:**
|
- **二分检索:**
|
||||||
|
|
||||||
@@ -362,7 +362,7 @@ $A(n) = \left \lfloor \log n \right \rfloor + \frac{1}{2}$
|
|||||||
|
|
||||||
解:
|
解:
|
||||||
|
|
||||||
$a = 1, b = 2, f(n) = 1, n^{\log_2 1} = 1$
|
$a = 1, b = 2, f (n) = 1, n^{\log_2 1} = 1$
|
||||||
|
|
||||||
根据主定理规则2:
|
根据主定理规则2:
|
||||||
|
|
||||||
@@ -373,7 +373,7 @@ $A(n) = \left \lfloor \log n \right \rfloor + \frac{1}{2}$
|
|||||||
$W(n) = 2W(\frac{n}{2}) + n - 1, W(1) = 0$
|
$W(n) = 2W(\frac{n}{2}) + n - 1, W(1) = 0$
|
||||||
|
|
||||||
解:
|
解:
|
||||||
$a = 2, b = 2, f(n) = n - 1, n^{\log_2 2} = n$
|
$a = 2, b = 2, f (n) = n - 1, n^{\log_2 2} = n$
|
||||||
|
|
||||||
根据主定理规则2:
|
根据主定理规则2:
|
||||||
|
|
||||||
@@ -385,10 +385,10 @@ $A(n) = \left \lfloor \log n \right \rfloor + \frac{1}{2}$
|
|||||||
|
|
||||||
解:
|
解:
|
||||||
|
|
||||||
$a = 2, b = 2, f(n) = n\log n, n^{\log_b a} = n$
|
$a = 2, b = 2, f (n) = n\log n, n^{\log_b a} = n$
|
||||||
|
|
||||||
不存在 $\epsilon > 0$ 使得:$n\log n = \Omega(n^{1 + \epsilon})$
|
不存在 $\epsilon > 0$ 使得:$n\log n = \Omega(n^{1 + \epsilon})$
|
||||||
|
|
||||||
不存在 $c < 1$ 使 $af(\frac{n}{b}) \le cf(n)$ 对所有充分大的 $n$ 成立
|
不存在 $c < 1$ 使 $af(\frac{n}{b}) \le cf (n)$ 对所有充分大的 $n$ 成立
|
||||||
|
|
||||||
$2(\frac{n}{2})\log{\frac{n}{2}} = n(\log n - 1) \le cn\log n$
|
$2(\frac{n}{2})\log{\frac{n}{2}} = n(\log n - 1) \le cn\log n$
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
# 解释: 有三种方法可以爬到楼顶。
|
# 解释: 有三种方法可以爬到楼顶。
|
||||||
# 1. 1 阶 + 1 阶 + 1 阶
|
# 1. 1 阶 + 1 阶 + 1 阶
|
||||||
# 2. 1 阶 + 2 阶
|
# 2. 1 阶 + 2 阶
|
||||||
# 3. 2 阶 + 1 阶
|
# 3. 2 阶 + 1 阶
|
||||||
###############################################################
|
###############################################################
|
||||||
|
|
||||||
class Solution:
|
class Solution:
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,6 @@ class Solution:
|
|||||||
if target - tmp in remain:
|
if target - tmp in remain:
|
||||||
return [i, remain.index(target - tmp) + i + 1]
|
return [i, remain.index(target - tmp) + i + 1]
|
||||||
|
|
||||||
|
|
||||||
################################################
|
################################################
|
||||||
#### 解法2
|
#### 解法2
|
||||||
################################################
|
################################################
|
||||||
@@ -36,6 +35,7 @@ class Solution:
|
|||||||
else:
|
else:
|
||||||
return [dict[target - nums[i]], i]
|
return [dict[target - nums[i]], i]
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
solution = Solution()
|
solution = Solution()
|
||||||
print(solution.twoSum([2, 7, 11, 15], 9))
|
print(solution.twoSum([2, 7, 11, 15], 9))
|
||||||
|
|||||||
@@ -86,4 +86,3 @@ if __name__ == '__main__':
|
|||||||
print(solution.anagramSolution2("heart", "earth"), " == True")
|
print(solution.anagramSolution2("heart", "earth"), " == True")
|
||||||
print(solution.anagramSolution2("python", "typhon"), " == True")
|
print(solution.anagramSolution2("python", "typhon"), " == True")
|
||||||
print(solution.anagramSolution2("qwert", "qwertg"), " == False")
|
print(solution.anagramSolution2("qwert", "qwertg"), " == False")
|
||||||
|
|
||||||
|
|||||||
@@ -105,9 +105,28 @@ class Solution:
|
|||||||
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
def maxSlidingWindow2(self, nums, k):
|
||||||
|
if not nums:
|
||||||
|
return []
|
||||||
|
window, res = [], []
|
||||||
|
|
||||||
|
for i, x in enumerate(nums):
|
||||||
|
if i >= k and window[0] <= i - k:
|
||||||
|
window.pop(0)
|
||||||
|
while window and nums[window[-1]] <= x:
|
||||||
|
window.pop()
|
||||||
|
window.append(i)
|
||||||
|
if i >= k - 1:
|
||||||
|
res.append(nums[window[0]])
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
solution = Solution()
|
solution = Solution()
|
||||||
print(solution.maxSlidingWindow([1, 3, -1, -3, 5, 3, 6, 7], 3), "= \n[3, 3, 5, 5, 6, 7]")
|
print(solution.maxSlidingWindow([1, 3, -1, -3, 5, 3, 6, 7], 3), "= \n[3, 3, 5, 5, 6, 7]")
|
||||||
print(solution.maxSlidingWindow([1, 3, 1, 2, 0, 5], 3), "= \n[3, 3, 2, 5]")
|
print(solution.maxSlidingWindow([1, 3, 1, 2, 0, 5], 3), "= \n[3, 3, 2, 5]")
|
||||||
print(solution.maxSlidingWindow([9, 10, 9, -7, -4, -8, 2, -6], 5), "= \n[10, 10, 9, 2]")
|
print(solution.maxSlidingWindow([9, 10, 9, -7, -4, -8, 2, -6], 5), "= \n[10, 10, 9, 2]")
|
||||||
|
|
||||||
|
print(solution.maxSlidingWindow2([1, 3, -1, -3, 5, 3, 6, 7], 3), "= \n[3, 3, 5, 5, 6, 7]")
|
||||||
|
print(solution.maxSlidingWindow2([1, 3, 1, 2, 0, 5], 3), "= \n[3, 3, 2, 5]")
|
||||||
|
print(solution.maxSlidingWindow2([9, 10, 9, -7, -4, -8, 2, -6], 5), "= \n[10, 10, 9, 2]")
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ class Solution:
|
|||||||
a. 用一个字典记录已经访问过的值及其下标
|
a. 用一个字典记录已经访问过的值及其下标
|
||||||
b. 如果访问到某个值num[i]是,发现其匹配值target - nums[i] 出现在dict里面,表示其左边有一个是可以与nums[i]想加得target,
|
b. 如果访问到某个值num[i]是,发现其匹配值target - nums[i] 出现在dict里面,表示其左边有一个是可以与nums[i]想加得target,
|
||||||
此时返回[dict[nums[i]], i]即为结果
|
此时返回[dict[nums[i]], i]即为结果
|
||||||
4. 过程中使用set对结果集去重,保证没有重复的三元组
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# 特判,过滤掉数组元素不够三个的情况
|
# 特判,过滤掉数组元素不够三个的情况
|
||||||
|
|||||||
@@ -42,6 +42,7 @@ class Solution:
|
|||||||
head.next, cur, head = cur, head, head.next
|
head.next, cur, head = cur, head, head.next
|
||||||
return cur
|
return cur
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
head = ListNode(1)
|
head = ListNode(1)
|
||||||
head.next = ListNode(2)
|
head.next = ListNode(2)
|
||||||
|
|||||||
@@ -35,17 +35,14 @@ class Solution:
|
|||||||
(Knowledge)
|
(Knowledge)
|
||||||
|
|
||||||
1. 用两个指针,pre指向当前遍历节点的前一个节点,cur指向当前节点;
|
1. 用两个指针,pre指向当前遍历节点的前一个节点,cur指向当前节点;
|
||||||
2. 用last记录上一次访问的数字;
|
2. 每次查看当前值和上一次访问的数字是否相同,相同则执行删除节点操作,不相同则两个指针右移
|
||||||
3. 每次查看当前值和上一次访问的数字是否相同,相同则执行删除节点操作,不相同则更新last和两个指针
|
|
||||||
|
|
||||||
(讲真,感觉last有点冗余hhh,直接pre.val好像可以替代last)
|
|
||||||
"""
|
"""
|
||||||
if not head:
|
if not head:
|
||||||
return None
|
return None
|
||||||
pre, last, cur = head, head.val, head.next
|
pre, cur = head, head.next
|
||||||
|
|
||||||
while cur:
|
while cur:
|
||||||
if cur.val == last:
|
if cur.val == pre.val:
|
||||||
pre.next = cur.next
|
pre.next = cur.next
|
||||||
else:
|
else:
|
||||||
last, pre = cur.val, cur
|
last, pre = cur.val, cur
|
||||||
|
|||||||
@@ -67,7 +67,6 @@ class Solution:
|
|||||||
result, miniGap = tmp, abs(target - tmp)
|
result, miniGap = tmp, abs(target - tmp)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def threeSumClosest2(self, nums, target):
|
def threeSumClosest2(self, nums, target):
|
||||||
"""
|
"""
|
||||||
:type nums: List[int]
|
:type nums: List[int]
|
||||||
@@ -114,9 +113,6 @@ class Solution:
|
|||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
solution = Solution()
|
solution = Solution()
|
||||||
print(solution.threeSumClosest([-3, -2, -5, 3, -4], -1), "= -2")
|
print(solution.threeSumClosest([-3, -2, -5, 3, -4], -1), "= -2")
|
||||||
|
|||||||
Reference in New Issue
Block a user