Skip to content

Commit c83ff7e

Browse files
committed
week01
1 parent d6cb746 commit c83ff7e

2 files changed

Lines changed: 126 additions & 16 deletions

File tree

Week01/189-rotate.php

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,38 @@
1-
189-rotate.php
1+
<?php
2+
class Solution {
3+
4+
/**
5+
* @param Integer[] $nums
6+
* @param Integer $k
7+
* @return NULL
8+
*/
9+
function rotate(&$nums, $k) {
10+
# 1.直接使用php的函数,时间复杂度O(1),空间复杂度O(n)
11+
// $len = count($nums);
12+
// $nums = array_merge(array_slice($nums, $len-$k), array_slice($nums, 0, $len-$k));
13+
14+
# 2.使用反转
15+
/** 原始数组 : 1 2 3 4 5 6 7
16+
反转所有数字后 : 7 6 5 4 3 2 1
17+
反转前 k 个数字后 : 5 6 7 4 3 2 1
18+
反转后 n-k 个数字后 : 5 6 7 1 2 3 4
19+
**/
20+
# 时间复杂度O(n),空间复杂度O(1)
21+
$len = count($nums);
22+
$k %= $len;
23+
$this->reverse($nums, 0, $len-1);
24+
$this->reverse($nums, 0, $k-1);
25+
$this->reverse($nums, $k, $len-1);
26+
}
27+
28+
function reverse(&$nums, $start, $end) {
29+
while ($start < $end) {
30+
$temp = $nums[$start];
31+
$nums[$start] = $nums[$end];
32+
$nums[$end] = $temp;
33+
$start++;
34+
$end--;
35+
}
36+
37+
}
38+
}

Week01/NOTE.md

Lines changed: 88 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
# 算法训练营第一周 学习笔记
2-
3-
## 一、常用工具配置
2+
##### 问题
3+
1. LeetCode困难级别的题较难理解,需要稳扎稳打多练习基础题,理解困难题的思路;
4+
2. Stack源码和Queue源码的讲解需要多看。
5+
## 常用工具配置
46
- 刻意练习
57

6-
## 二、基本功和编程指法
8+
## 基本功和编程指法
79
- Best Practices/Top tips
810

9-
## 三、时间复杂度、空间复杂度
11+
## 时间复杂度
1012
- Big O notation
1113
- O(1): Constant Complexity 常数复杂度
1214
- O(log n): Logatithmix Complexity 对数复杂度
@@ -16,14 +18,85 @@
1618
- O(2^n): Exponential Growth 指数
1719
- O(n!): Factorial 阶乘
1820

19-
- 主定理
20-
Application to common algorithms
21-
|Algorithm |Recurrence relationship |Run time |
22-
|:-----------|:-----------------:|--------------:|
23-
|Binary search(二分查找)|T(n)=T(n/2)+O(1)|O(logn)|
24-
|Binary tree traversal(二叉树的遍历)|T(n)=2T(n/2)+O(1)|O(n)|
25-
|Optimal sorted matrix search(最佳排序矩阵二分查找)|T(n)=2T(n/2)+O(logn)|O(n)|
26-
|Merge sort(归并排序)|T(n)=2T(n/2)+O(n)|O(nlogn)|
27-
注:
28-
1. 二叉树的每个节点都会访问一次且仅访问一次,时间复杂度O(n);
29-
2. 一维数组进行查找O(logn),二维有序的矩阵进行查找O(n)。
21+
[如何理解算法复杂度的表示法](https://www.zhihu.com/question/21387264)
22+
23+
- [主定理](http://zh.wikipedia.org/wiki/%E4%B8%BB%E5%AE%9A%E7%90%86) [Master theorem](http://en.wikipedia.org/wiki/Master_theorem_(analysis_of_algorithms))
24+
Application to common algorithms
25+
26+
| Algorithm | Recurrence relationship | Run time |
27+
|:-----------|:-----------------|:--------------|
28+
| Binary search(二分查找) | T(n)=T(n/2)+O(1) | O(logn) |
29+
| Binary tree traversal(二叉树的遍历) | T(n)=2T(n/2)+O(1) | O(n) |
30+
| Optimal sorted matrix search(最佳排序矩阵二分查找) | T(n)=2T(n/2)+O(logn) | O(n) |
31+
| Merge sort(归并排序) | T(n)=2T(n/2)+O(n) | O(nlogn) |
32+
注:
33+
一维数组进行查找O(logn),二维有序的矩阵进行查找O(n):
34+
1. 二分查找时间复杂度O(logn);
35+
2. 二叉树的前序遍历、中序遍历、后序遍历,时间复杂度O(n),n是二叉树里面的节点总数,二叉树的每个节点都会访问一次且仅访问一次;
36+
3. 图的遍历,时间复杂度O(n),n是图里面的节点总数;
37+
4. 搜索算法DFS深度优先、BFS广度优先,时间复杂度O(n),n是搜索空间的节点总数。
38+
39+
## 空间复杂度
40+
- 数组的长度
41+
- 一维数组:长度为传入的元素个数,空间复杂度为O(n);
42+
- 二维数组:长度为n平方,空间复杂度O(n^2)。
43+
- 递归的深度
44+
- 递归最深的深度即空间复杂度的最大值。
45+
46+
*注:即有递归又有数组,两者之间的最大值即空间复杂度。*
47+
48+
## 数组、链表、跳表的基本实现和特性
49+
- 数组 Array
50+
- 特性:底层硬件实现基于内存管理器,每当申请数组时,计算机在内存中开辟了一段连续的地址,每一个地址可以直接通过内存管理器进行访问。访问第一个元素和访问中间的任何一个元素,时间复杂度都是O(1),可以随机的访问任何一个元素且访问速度特别快。
51+
- 缺点:增加删除元素时,时间复杂度O(n)。
52+
53+
| 操作 | 时间复杂度 |
54+
|:-----------|:------------|
55+
| prepend | O(1) |
56+
| append | O(1) |
57+
| lookup | O(1) |
58+
| insert | O(n) |
59+
| delete | O(n) |
60+
61+
*注:正常情况下数组prepend操作的时间复杂度是O(n),但是可以进行特殊优化到O(1)。采用的方式是申请稍微大一些的内存空间,然后在数组最开始预留一部分空间,然后prepend的操作则是把头下标前移一个位置即可。*
62+
63+
- 链表 Linked List
64+
- 单链表
65+
- 双向链表
66+
- 循环链表
67+
68+
| 操作 | 时间复杂度|
69+
|:--------|:---------------|
70+
| prepend | O(1) |
71+
| append | O(1) |
72+
| lookup | O(n) |
73+
| insert | O(1) |
74+
| delete | O(1) |
75+
76+
- 跳表 Skip List
77+
*注:只能用于元素有序的情况。*
78+
跳表(skip list)对标的是平衡树(AVL Tree)和二分查找,是一种插入/删除/搜索都是O(logn)的数据结构。升维思想+空间换时间。
79+
- 优势:原理简单、容易实现、方便扩展、效率更高。在一些热门的项目里用来替代平衡树,如Redis、LevelDB(Google用来取代BigTable)等。
80+
- 缺点:由于元素进行多次的增加和删除导致索引并不是完全工整;维护成本相对较高,每增加或删除一个元素需要把索引更新一遍。
81+
- 复杂度:在跳表中查询任意数据的时间复杂度是O(logn),空间复杂度O(n)。
82+
- 工程应用:
83+
- LRU Cache-Linked List
84+
- [LRU缓存算法](https://www.jianshu.com/p/b1ab4a170c3c)
85+
- [LRU缓存机制](https://leetcode-cn.com/problems/lru-cache/)
86+
- Redis-Skip List
87+
- [跳跃表](https://redisbook.readthedocs.io/en/latest/internal-datastruct/skiplist.html)
88+
- [为什么redis使用跳表?](https://www.zhihu.com/question/20202931)
89+
90+
91+
## 栈和队列的基本实现和特性
92+
- 栈(Stack)Last in - First out
93+
- 先入后出,增加、删除皆为O(1) ,查询是无序的O(n)
94+
- 队列(Queue)First in - First out
95+
- 先入先出,添加、删除皆为O(1) ,查询O(n)
96+
- 双端队列(Deque:Double-End Queue)
97+
- 两端可以进出的Queue,插入、删除O(1) ,查询O(n)
98+
- 优先队列(Priority Queue)
99+
- 插入操作O(1)
100+
- 取出操作O(logN) - 按照元素的优先级取出
101+
- 底层具体实现的数据结构较为多样和复杂:heap(堆)
102+

0 commit comments

Comments
 (0)