Skip to content

Commit 43ab6b4

Browse files
authored
Merge pull request algorithm004-01#432 from ifls/master
631-Week 02
2 parents f8efcc6 + a881a4d commit 43ab6b4

File tree

6 files changed

+189
-2
lines changed

6 files changed

+189
-2
lines changed

Week 01/id_631/LeetCode_189_631.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
func rotate(nums []int, k int) {
2+
swapArray(nums, 0, len(nums))
3+
swapArray(nums, 0, k % len(nums))
4+
swapArray(nums, k % len(nums), len(nums))
5+
}
6+
7+
func swapArray(nums []int, start, end int) {
8+
for i := start; i < (end - start) / 2 + start; i++ {
9+
right := end - 1 - (i - start)
10+
temp := nums[i]
11+
nums[i] = nums[right]
12+
nums[right] = temp
13+
}
14+
}

Week 01/id_631/LeetCode_282_631.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
func moveZeroes(nums []int) {
2+
insert := 0
3+
for i := 0; i < len(nums); i++ {
4+
if nums[i] != 0 {
5+
nums[insert] = nums[i]
6+
insert++
7+
}
8+
}
9+
for insert < len(nums) {
10+
nums[insert] = 0
11+
insert++
12+
}
13+
}

Week 02/id_631/LeetCode_242_631.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func isAnagram(s string, t string) bool {
2+
if len(s) != len(t) {
3+
return false
4+
}
5+
6+
counter := map[byte]int{}
7+
8+
for i := 0; i < len(s); i++ {
9+
counter[s[i]]++
10+
counter[t[i]]--
11+
}
12+
13+
for _, r := range counter {
14+
if r >= 1 {
15+
return false
16+
}
17+
}
18+
19+
return true
20+
}

Week 02/id_631/LeetCode_77_631.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
var ret [][]int
2+
3+
func combine1(n int, k int) [][]int {
4+
ret = [][]int{}
5+
combine1r(n, k, []int{})
6+
return ret
7+
}
8+
9+
func combine1r(n int, k int, includ []int) {
10+
if k == 0 {
11+
ret = append(ret, includ)
12+
return
13+
}
14+
15+
for i := 1; i <= n; i++ {
16+
if contains(includ, i) {
17+
return
18+
}
19+
20+
include := append([]int{}, i)
21+
include = append(include, includ...)
22+
combine1r(n, k - 1, include)
23+
}
24+
}
25+
26+
func contains(a []int, t int) bool {
27+
for _, v := range a {
28+
if v == t {
29+
return true
30+
}
31+
}
32+
33+
return false
34+
}

Week 02/id_631/LeetCode_94_631.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
func inorderTraversal(root *TreeNode) []int {
2+
if root == nil {
3+
return []int{}
4+
}
5+
6+
arr := make([]int, 0)
7+
8+
arr = append(arr, inorderTraversal2(root.Left)...)
9+
10+
arr = append(arr, root.Val)
11+
12+
arr = append(arr, inorderTraversal2(root.Right)...)
13+
14+
return arr
15+
}

Week 02/id_631/NOTE.md

Lines changed: 93 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,95 @@
1-
# NOTE
1+
# 第二周学习总结
22

3-
3+
1.哈希表
4+
哈希表是由Hash函数将各种类型的键映射为数值,从而可以直接在数组(内存)连续存储位置随机访问的数据结构。好的哈希函数能够减少哈希冲突。处理哈希冲突一般有拉链表法和开放寻址法。java HashMap使用的是拉链表法,将拥有相同哈希值的数据保存在一个链表中,当链表长度超过TREEIFY_THRESHOLD时,会使用红黑树代替链表来储存数据。从而避免链表很长时,导致哈希表的查询时间复杂度从O(1)退化为O(n)。
45

6+
哈希表插入,查询,删除的平均时间复杂度O(1),最差时间复杂度O(n),最差空间复杂度O(n)。
7+
8+
1.1 集合:Java HashSet是由HashMap实现。集合是不能存放重复的元素的数据结构。
9+
10+
2.树
11+
树是一种二维数据结构。可以当成是有向无环图。
12+
13+
术语
14+
父亲节点:一个节点含有子节点,则这个节点称为其子节点的父节点
15+
儿子节点:一个节点含有的子树的根节点称为该节点的子节点
16+
兄弟节点:拥有相同父亲节点的节点。
17+
深度:root节点为第一层,每次到达下一个子节点,深度+1。
18+
19+
树和图的区别:有方向(从根到叶子),有没有环, 算是一种特殊的图。
20+
21+
链表是特殊化的树,树是特殊化的图。
22+
23+
2.1 二叉树:儿子节点只有两个的树。
24+
25+
二叉树的节点的Java定义
26+
```
27+
public class TreeNode {
28+
int val;
29+
TreeNode left;
30+
TreeNode right;
31+
TreeNode(int x) { val = x; }
32+
}
33+
```
34+
2.2 二叉搜索树bst Binary Search Tree
35+
定义:一棵空树,或者具有以下性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值
36+
37+
查询插入和删除的平均时间复杂度是log(n),最差时间复杂度O(n)
38+
39+
遍历:
40+
前序遍历:root -> left -> right
41+
中序遍历:left -> root -> right
42+
后续遍历:left -> right -> root
43+
44+
因此,前序遍历第一个值是根节点的值;后续遍历最后一个是根节点值。
45+
46+
3.递归,分治,回溯
47+
3.1 递归
48+
解决递归问题的四步模板:
49+
1. 递归终结条件
50+
2. 处理当前层逻辑
51+
3. 下探到下一层
52+
4. 清理当前层。
53+
54+
解题思维要点
55+
1.不要人肉进行递归(不要画递归状态树,直接写函数)
56+
2.找到最近最简的方法,将其拆解成可重复解决的问题(重复子问题)
57+
3.数学归纳法思维
58+
59+
3.2分治法
60+
重点是找重复性以及分解问题
61+
分治法代码模板:
62+
```
63+
def divide_conquer(problem, param1, param2, ...):
64+
# recursion terminator
65+
if problem is None:
66+
print_result
67+
return
68+
69+
# prepare data
70+
data = prepare_data(problem)
71+
subproblems = split_problem(problem, data)
72+
73+
# conquer subproblems
74+
subresult1 = self.divide_conquer(subproblems[0], p1, ...)
75+
subresult2 = self.divide_conquer(subproblems[1], p1, ...)
76+
subresult3 = self.divide_conquer(subproblems[2], p1, ...)
77+
78+
79+
# process and generate the final result
80+
result = process_result(subresult1, subresult2, subresult3, …)
81+
82+
# revert the current level states
83+
```
84+
分治法解决问题的5步模板:
85+
1.递归终结条件
86+
2.分解子问题
87+
3.解决子问题
88+
4.处理子问题的答案,得到当前结果
89+
5.清理当前层状态
90+
91+
3.3回溯法
92+
93+
回溯法:一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
94+
95+
典型例题: 8皇后问题

0 commit comments

Comments
 (0)