Skip to content

Commit 5b05515

Browse files
committed
第一周作业
1 parent 0fd6bbe commit 5b05515

6 files changed

Lines changed: 174 additions & 1 deletion

File tree

Week01/NOTE.md

Lines changed: 0 additions & 1 deletion
This file was deleted.

Week01/README.md

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
# 第一周学习笔记
2+
## 时间复杂度
3+
![时间复杂度](./assets/images/complexity.png)
4+
## 数组、链表、跳表的基本实现和特性
5+
### Array 数组
6+
* 实现:申请数组,在内存地址中申请一段连续的地址。每个地址都可以通过内存管理器直接访问
7+
* 特性:
8+
1. 访问快:时间复杂度O(1)
9+
2. 增删慢:时间复杂度O(n)
10+
11+
### Linked List 链表
12+
* 实现
13+
14+
![Linked List](./assets/images/LinkedList.jpg)
15+
16+
```
17+
// js 单向链表实现
18+
19+
class Node {
20+
constructor(value) {
21+
this.value = value
22+
this.next = null
23+
}
24+
}
25+
26+
class LinkedList {
27+
constructor(head) {
28+
this.head = new Node(head);
29+
}
30+
31+
find(item) {
32+
let currNode = this.head;
33+
while(currNode.value != item) {
34+
curNode = currNode.next;
35+
}
36+
return currNode;
37+
}
38+
39+
findPrevious(item) {
40+
let currNode = this.head;
41+
while(currNode.next.value != item) {
42+
currNode = currNode.next;
43+
}
44+
return currNode;
45+
}
46+
47+
insert(newItem, item) {
48+
let node = this.find(item)
49+
let newNode = new Node(newItem);
50+
newNode.next = node.next;
51+
node.next = newNode;
52+
}
53+
54+
remove(item) {
55+
let preNode = this.findPrevious(item);
56+
preNode.next = preNode.next.next;
57+
}
58+
}
59+
```
60+
* 分类
61+
1. 单链表:只有next指针
62+
2. 双向链表:有pre或者previous指针和next指针
63+
3. 循环链表: Tail的指针next指会到Head来
64+
65+
* 特点
66+
1. 查询慢:时间复杂度O(n)
67+
2. 增删快:时间复杂度O(1)
68+
69+
* 工程中的应用:LRU Cache
70+
<https://www.jianshu.com/p/379b5e0624d4>
71+
<https://leetcode-cn.com/problems/lru-cache/>
72+
73+
### Skip List 跳表
74+
*注意:只能用于元素有序的情况。*
75+
*所以,跳表(skip list)对标的是二叉搜索树中的平衡树(AVL Tree)和二分查找。是一种 插入/删除/搜索都是O(log n)的数据结构*
76+
*原理简单、容易实现、方便扩展、效率风高。因此在一些热门的项目里用来替代平衡术,如RRedis、LevelDB等*
77+
78+
* 实现: 升维思想(建立多层索引),空间换时间
79+
* 特点:
80+
1. 查询相对普通链表快: 时间复杂度O(logn)
81+
2. 增删相对普通链表慢:时间复杂度O(logn)
82+
3. 空间复杂度 O(n)
83+
84+
* 工程中的应用:Redis
85+
86+
## 栈和队列的实现与特性
87+
### Stack 栈
88+
* 实现: 数组,链表
89+
* 特点:
90+
1. 先入后出 FILO
91+
2. 添加、删除皆为O(1)
92+
3. 查询O(n)
93+
94+
### Queue 队列
95+
* 实现: 数组、链表
96+
* 特点
97+
1. 先入先出 FIFO
98+
2. 添加、删除皆为O(1)
99+
3. 查询O(n)
100+
101+
### Deque 双端队列
102+
* 实现:定义为接口,抽象数据接口,可用数组、链表实现
103+
* 特点
104+
1. 插入删除O(1)
105+
2. 查询O(n)
106+
107+
### Priority Queue
108+
* 实现:定义为接口,抽象数据接口,底层具体实现的数据结构较为多样性和复杂:heap、bst、treap
109+
* 特点
110+
1. 按优先级先出
111+
2. 插入O(1)
112+
3. 取出O(logn) - 按照元素的优先级取出
119 KB
Loading
1.89 MB
Loading
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
/**
2+
* @param {number[]} nums1
3+
* @param {number} m
4+
* @param {number[]} nums2
5+
* @param {number} n
6+
* @return {void} Do not return anything, modify nums1 in-place instead.
7+
*/
8+
var merge = function(nums1, m, nums2, n) {
9+
var i = m - 1;
10+
var j = n - 1;
11+
while(i >=0 && j >= 0) {
12+
nums1[i + j + 1] = nums1[i] >= nums2[j] ? nums1[i--] : nums2[j--];
13+
}
14+
while(j >= 0) {
15+
nums1[j] = nums2[j--];
16+
}
17+
};
18+
/**
19+
* @description 优化
20+
* @param {number[]} nums1
21+
* @param {number} m
22+
* @param {number[]} nums2
23+
* @param {number} n
24+
* @return {void} Do not return anything, modify nums1 in-place instead.
25+
*/
26+
var mergeOptimization = function(nums1, m, nums2, n) {
27+
var i = m - 1;
28+
var j = n - 1;
29+
while(j >= 0) {
30+
nums1[i + j + 1] = i >= 0 && nums1[i] >= nums2[j] ? nums1[i--] : nums2[j--];
31+
}
32+
};

Week01/programming/move-zeroes.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {void} Do not return anything, modify nums in-place instead.
4+
*/
5+
var moveZeroes = function(nums) {
6+
var j = 0;
7+
for(var i = 0; i < nums.length; i ++) {
8+
if (nums[i] != 0) {
9+
var temp = nums[i];
10+
nums[i] = nums[j];
11+
nums[j++] = temp;
12+
}
13+
}
14+
};
15+
16+
/**
17+
* @description 另一种交换
18+
* @param {number[]} nums
19+
* @return {void} Do not return anything, modify nums in-place instead.
20+
*/
21+
var moveZeroes1 = function(nums) {
22+
var j = 0;
23+
for(var i = 0; i < nums.length; i++) {
24+
if (nums[i] !== 0) {
25+
nums[j] = nums[i];
26+
nums[i] = j === i ? nums[i] : 0;
27+
j++;
28+
}
29+
}
30+
};

0 commit comments

Comments
 (0)