Skip to content

Commit b804f30

Browse files
committed
week01-homework
1 parent 0fd6bbe commit b804f30

2 files changed

Lines changed: 170 additions & 1 deletion

File tree

Week01/NOTE.md

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,41 @@
1-
学习笔记
1+
## 数据结构时间复杂度
2+
<br/>
3+
4+
| 类型 | add | remove | query | modify | peculiarity |
5+
| :----: | :----: | :----: | :----: | :----: | :----: |
6+
| Array | O(n) | O(n) | O(1) | O(1) | 随机加速访问 |
7+
| Linked List | O(1) | O(1) | O(n) | O(1) | next指针 |
8+
| Double Linked List | O(1) | O(1) | O(n) | O(1) | pre,next指针 |
9+
| Skip List | O(logn) | O(logn) | O(logn) | -- | 元素有序 |
10+
| Stack | O(1) | O(1) | O(n) | -- | 后进先出 |
11+
| Queue | O(1) | O(1) | O(n) | -- | 先进先出 |
12+
| Deque | O(1) | O(1) | O(n) | -- | 两端都可进出的Quue |
13+
| Priority Queue | O(1) | -- | O(logn) | -- | 两端都可进出的Quue |
14+
<br/>
15+
16+
## PriorityQueue分析
17+
```
18+
balanced binary heap:
19+
父结点的键值总是小于或等于任何一个子节点的键值
20+
基于数组实现的二叉堆,对于数组中任意位置的n上元素,其左孩子在[2n+1]位置上,右孩子[2(n+1)]位置,它的父亲则在[n-1/2]上,而根的位置则是[0]
21+
fields:
22+
comparator--比较器,无此参数元素使用自然排序
23+
queue--数组(存数据)
24+
size--元素个数
25+
method:
26+
#grow -- 数组扩容
27+
#hugeCapacity -- 容量:0-Integer.MAX_VALUE
28+
#add -- 调用offer(E e)
29+
#offer -- size >= queue.length (扩容),size == 0直接添加为根,否则从队尾开始上移 --> siftUp
30+
#siftUp
31+
#siftUpComparable -- 一直上移至找到父节点
32+
#siftUpUsingComparator -- 操作类似,自然排序
33+
#peek -- 查看队列首元素,空时返回null
34+
#indexOf -- 查看元素对应下标
35+
#remove -- 获取要移除元素下标i,--size,提取e = queue[size],queue[size] = null, i < size / 2将queue[i]不断下移,否则上移
36+
#poll -- 移除根, --size,提取e = queue[size],queue[size] = null,queue[i]不断下移,直到queue[i]的最小孩子比e 大为止
37+
#siftDown
38+
#siftDownComparable -- 以k为父节点找子节点(left, right),c = queue[left],
39+
如果left < right && queue[left] > queue[right] { c = queue[right] },交换父节点和c;直至队尾元素比c的子节点都要小
40+
#siftDownUsingComparator -- 操作类似,自然排序
41+
```

Week01/homework.md

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
## Week01 homework
2+
<br>
3+
4+
### 删除排序数组中的重复项
5+
```java
6+
public int removeDuplicates(int[] nums) {
7+
if (nums == null && nums.length == 0) {
8+
return 0;
9+
}
10+
int left = 0;
11+
for (int i = 1; i < nums.length; i++) {
12+
if (nums[i] != nums[left]) {
13+
nums[++left] = nums[i];
14+
}
15+
}
16+
return ++left;
17+
}
18+
```
19+
<br/>
20+
21+
### 旋转数组
22+
```java
23+
public void rotate(int[] nums, int k) {
24+
// 使用环状替代,k %= nums.length
25+
k %= nums.length;
26+
int count = 0;
27+
for (int start = 0; count < nums.length; start++) {
28+
int current = start;
29+
int pre = nums[start];
30+
do {
31+
int next = (current + k) % nums.length;
32+
int temp = nums[next];
33+
nums[next] = pre;
34+
pre = temp;
35+
current = next;
36+
count++;
37+
} while (start != current);
38+
}
39+
}
40+
```
41+
<br/>
42+
43+
### 合并两个有序链表
44+
```java
45+
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
46+
ListNode preHead = new ListNode(-1);
47+
ListNode pre = preHead;
48+
while (l1 != null && l2 != null) {
49+
if (l1.val < l2.val) {
50+
pre.next = l1;
51+
l1 = l1.next;
52+
} else {
53+
pre.next = l2;
54+
l2 = l2.next;
55+
}
56+
pre = pre.next;
57+
}
58+
pre.next = l1 == null ? l2 : l1;
59+
return preHead.next;
60+
}
61+
```
62+
<br/>
63+
64+
### 合并两个有序数组
65+
```java
66+
public void merge(int[] nums1, int m, int[] nums2, int n) {
67+
while (m > 0 && n > 0) {
68+
nums1[m + n - 1] = nums1[m - 1] > nums2[n - 1] ? nums1[--m] : nums2[--n];
69+
}
70+
for (int i = 0; i < n; i++) {
71+
nums1[i] = nums2[i];
72+
}
73+
}
74+
```
75+
<br/>
76+
77+
### 两数之和
78+
```java
79+
public int[] twoSum(int[] nums, int target) {
80+
// 循环遍历数组,num[i]存在于map中,直接返回map中的value和i
81+
// 否则,将key:target - nums[i] value:i 存入map中
82+
int length = nums.length;
83+
Map<Integer, Integer> map = new HashMap<>(length);
84+
for (int i = 0; i < length; i++) {
85+
if (map.containsKey(nums[i])) {
86+
return new int[]{map.get(nums[i]), i};
87+
}
88+
map.put(target - nums[i], i);
89+
}
90+
return null;
91+
}
92+
```
93+
<br/>
94+
95+
### 移动零
96+
```java
97+
public void moveZeroes(int[] nums) {
98+
if (nums == null) {
99+
return;
100+
}
101+
int index = 0;
102+
for (int i = 0; i < nums.length; i++) {
103+
if (nums[i] != 0) {
104+
if (index != i) {
105+
nums[index] = nums[i];
106+
nums[i] = 0;
107+
}
108+
index++;
109+
}
110+
}
111+
}
112+
```
113+
114+
### 加一
115+
```java
116+
public int[] plusOne(int[] digits) {
117+
// digits数组中所有位全进1,则新new一个digits.length + 1长度的数组,并把首位置为1
118+
for (int i = digits.length - 1; i >= 0; i--) {
119+
digits[i] += 1;
120+
if (digits[i] % 10 != 0) {
121+
return digits;
122+
}
123+
digits[i] = 0;
124+
}
125+
digits = new int[digits.length + 1];
126+
digits[0] = 1;
127+
return digits;
128+
}
129+
```

0 commit comments

Comments
 (0)