From 505e290f25aa61ee667afcee6c47e9987c6debc8 Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 25 Oct 2020 10:51:22 +0800 Subject: [PATCH 01/17] first --- go.mod | 3 ++ .../main.go" | 29 +++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 go.mod create mode 100644 "week01/\345\210\240\351\231\244\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/main.go" diff --git a/go.mod b/go.mod new file mode 100644 index 00000000..dbeac5df --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module algorithm + +go 1.15 diff --git "a/week01/\345\210\240\351\231\244\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/main.go" "b/week01/\345\210\240\351\231\244\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/main.go" new file mode 100644 index 00000000..4afb9074 --- /dev/null +++ "b/week01/\345\210\240\351\231\244\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\351\207\215\345\244\215\351\241\271/main.go" @@ -0,0 +1,29 @@ +package main + +//地址 https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ + +// 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 + +// 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 + +// 示例1 给定数组 nums = [1,1,2], + +// 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 + +// 你不需要考虑数组中超出新长度后面的元素。 + +// 重点 排序 如果乱序是得重新开辟空间来解决问题,就无法使用o(1)的空间完成 +func removeDuplicates(nums []int) int { + var j = 0 + for i := 1; i < len(nums); i++ { + if nums[i] != nums[j] { + j++ + nums[j] = nums[i] + } + } + return j + 1 +} + +func main() { + +} From f8c31c66b0af2ccaa84ede827b0995fe4627feb1 Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 25 Oct 2020 21:51:02 +0800 Subject: [PATCH 02/17] week --- .vscode/launch.json | 13 +++ .../main.go" | 20 +++++ "week01/\345\212\240\344\270\200/main.go" | 24 ++++++ .../main.go" | 83 +++++++++++++++++++ .../main.go" | 41 +++++++++ .../main.go" | 76 +++++++++++++++++ .../main.go" | 42 ++++++++++ .../main.go" | 42 ++++++++++ "week01/\347\247\273\345\212\2500/main.go" | 25 ++++++ 9 files changed, 366 insertions(+) create mode 100644 .vscode/launch.json create mode 100644 "week01/\344\270\244\346\225\260\344\271\213\345\222\214/main.go" create mode 100644 "week01/\345\212\240\344\270\200/main.go" create mode 100644 "week01/\345\217\214\347\253\257\351\230\237\345\210\227/main.go" create mode 100644 "week01/\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/main.go" create mode 100644 "week01/\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/main.go" create mode 100644 "week01/\346\216\245\351\233\250\346\260\264/main.go" create mode 100644 "week01/\346\227\213\350\275\254\346\225\260\347\273\204/main.go" create mode 100644 "week01/\347\247\273\345\212\2500/main.go" diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 00000000..d95d6544 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,13 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Launch file", + "type": "go", + "request": "launch", + "mode": "debug", + "program": "D:\\algorithm018\\week01\\接雨水\\main.go", + "showLog": true + } + ] +} \ No newline at end of file diff --git "a/week01/\344\270\244\346\225\260\344\271\213\345\222\214/main.go" "b/week01/\344\270\244\346\225\260\344\271\213\345\222\214/main.go" new file mode 100644 index 00000000..263ee25a --- /dev/null +++ "b/week01/\344\270\244\346\225\260\344\271\213\345\222\214/main.go" @@ -0,0 +1,20 @@ +package main + +//两数之和 暴力求解,两重for循环 +//利用hash结构来做 nums的value为键,index为键 + +//参考官方推荐的例子 +func twoSum(nums []int, target int) []int { + hashTable := map[int]int{} + for i, x := range nums { + if p, ok := hashTable[target-x]; ok { + return []int{p, i} + } + hashTable[x] = i + } + return nil +} + +func main() { + +} diff --git "a/week01/\345\212\240\344\270\200/main.go" "b/week01/\345\212\240\344\270\200/main.go" new file mode 100644 index 00000000..0186ee87 --- /dev/null +++ "b/week01/\345\212\240\344\270\200/main.go" @@ -0,0 +1,24 @@ +package main + +// 示例 1: + +// 输入: [1,2,3] +// 输出: [1,2,4] +// 解释: 输入数组表示数字 123。 + +// 如同10进制的加减法一样 反着处理应该更好 +// +func plusOne(digits []int) []int { + + for i := len(digits) - 1; i >= 0; i-- { + digits[i]++ + //参考 如果为0 ,则直接返回即可 + digits[i] = digits[i] % 10 + if digits[i] != 0 { + return digits + } + } + digits = append(digits, 0) + digits[0] = 1 + return digits +} diff --git "a/week01/\345\217\214\347\253\257\351\230\237\345\210\227/main.go" "b/week01/\345\217\214\347\253\257\351\230\237\345\210\227/main.go" new file mode 100644 index 00000000..530cb09d --- /dev/null +++ "b/week01/\345\217\214\347\253\257\351\230\237\345\210\227/main.go" @@ -0,0 +1,83 @@ +package main + +// 设计实现双端队列。 +// 你的实现需要支持以下操作: + +// MyCircularDeque(k):构造函数,双端队列的大小为k。 +// insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true。 +// insertLast():将一个元素添加到双端队列尾部。如果操作成功返回 true。 +// deleteFront():从双端队列头部删除一个元素。 如果操作成功返回 true。 +// deleteLast():从双端队列尾部删除一个元素。如果操作成功返回 true。 +// getFront():从双端队列头部获得一个元素。如果双端队列为空,返回 -1。 +// getRear():获得双端队列的最后一个元素。 如果双端队列为空,返回 -1。 +// isEmpty():检查双端队列是否为空。 +// isFull():检查双端队列是否满了。 + +//双端队列 用前索引跟后索引确认当前数据 +type MyCircularDeque struct { + data []int + front int + end int +} + +/** Initialize your data structure here. Set the size of the deque to be k. */ +func Constructor(k int) MyCircularDeque { + return MyCircularDeque{ + data: make([]int, k), + front: 0, + end: 0, + } +} + +/** Adds an item at the front of Deque. Return true if the operation is successful. */ +func (this *MyCircularDeque) InsertFront(value int) bool { + this.front = (len(this.data) + this.front - 1) % len(this.data) // 先循环左移一位 + this.data[this.front] = value // 填入数据 + return true +} + +/** Adds an item at the rear of Deque. Return true if the operation is successful. */ +func (this *MyCircularDeque) InsertLast(value int) bool { + // 插入元素 + this.data[this.end] = value // 填入数据 + this.end = (this.end + 1) % len(this.data) // 循环右移一位 + return true +} + +/** Deletes an item from the front of Deque. Return true if the operation is successful. */ +func (this *MyCircularDeque) DeleteFront() bool { + this.front = (this.front + 1) % len(this.data) // 循环右移一位 + return true +} + +/** Deletes an item from the rear of Deque. Return true if the operation is successful. */ +func (this *MyCircularDeque) DeleteLast() bool { + this.end = (len(this.data) + this.end - 1) % len(this.data) // 循环左移一位 + return true +} + +/** Get the front item from the deque. */ +func (this *MyCircularDeque) GetFront() int { + + // 获取头部元素 + return this.data[this.front] +} + +/** Get the last item from the deque. */ +func (this *MyCircularDeque) GetRear() int { + return this.data[this.end] +} + +/** Checks whether the circular deque is empty or not. */ +func (this *MyCircularDeque) IsEmpty() bool { + return this.end == this.front +} + +/** Checks whether the circular deque is full or not. */ +func (this *MyCircularDeque) IsFull() bool { + return (this.front+1)%len(this.data) == this.front +} + +func main() { + +} diff --git "a/week01/\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/main.go" "b/week01/\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/main.go" new file mode 100644 index 00000000..b1339da6 --- /dev/null +++ "b/week01/\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\346\225\260\347\273\204/main.go" @@ -0,0 +1,41 @@ +package main + +import "fmt" + +// 给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 + +// 说明: + +// 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 +// 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 + +//有序数组 +// 1 暴力破解法 使用多余的数组空间存放,然后再进行排序 +// 2 从小到大的数组 最优解肯定是从后往前处理数据 +// 利用原数组空间修改数据 而不是移动 +func merge(nums1 []int, m int, nums2 []int, n int) { + end1 := m - 1 + end2 := n - 1 + l := m + n - 1 + for end1 >= 0 && end2 >= 0 { + if nums1[end1] < nums2[end2] { + nums1[l] = nums2[end2] + end2-- + } else { + nums1[l] = nums1[end1] + end1-- + } + l-- + } + //碰到 [0] 1 [1] 1单元测试不通过 + for end2 >= 0 { + nums1[l] = nums2[end2] + l-- + end2-- + } + fmt.Print(nums1) +} + +func main() { + //测试还不知道咋个传值 merge([]int{0}, 1, []int{1}, 1) +} diff --git "a/week01/\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/main.go" "b/week01/\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/main.go" new file mode 100644 index 00000000..843a7fa5 --- /dev/null +++ "b/week01/\345\220\210\345\271\266\344\270\244\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250/main.go" @@ -0,0 +1,76 @@ +package main + +// 示例: + +// 输入:1->2->4, 1->3->4 +// 输出:1->1->2->3->4->4 + +//1 利用新的数组存放元素,然后再构建链表 时间复杂度为o(n) 空间复杂度o(n) +//2 使用递归 由于是有序的,这个时候只需要修改链表的next的指针值即可 +//3 使用多余的存储空间 +type ListNode struct { + Val int + Next *ListNode +} + +// func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { +// if l1 == nil { +// return l2 +// } +// if l2 == nil { +// return l1 +// } +// if l1.Val < l2.Val { +// l1.Next = mergeTwoLists(l1.Next, l2) +// return l1 +// } else { +// l2.Next = mergeTwoLists(l1, l2.Next) +// return l2 +// } +// } + +func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { + tempNode := &ListNode{} + prev := &ListNode{} + prev = tempNode + for l1 != nil && l2 != nil { + if l1.Val < l2.Val { + tempNode.Next = l1 + l1 = l1.Next + } else { + tempNode.Next = l2 + l2 = l2.Next + } + tempNode = tempNode.Next + } + //容易遗忘的点,上面的跳出循环的条件是某个链表结束 所以剩下的节点一定是大于当前的所有点,直接拼接在后面即可 + if l1 == nil { + tempNode.Next = l2 + } else { + tempNode.Next = l1 + } + return prev.Next +} +func printNode(l1 *ListNode) { + for l1 != nil { + println(l1.Val) + l1 = l1.Next + } +} + +func main() { + l1 := &ListNode{Val: 1} + l2 := &ListNode{Val: 2} + l3 := &ListNode{Val: 4} + l1.Next = l2 + l2.Next = l3 + + l4 := &ListNode{Val: 1} + l5 := &ListNode{Val: 3} + l6 := &ListNode{Val: 4} + + l4.Next = l5 + l5.Next = l6 + + printNode(mergeTwoLists(l1, l4)) +} diff --git "a/week01/\346\216\245\351\233\250\346\260\264/main.go" "b/week01/\346\216\245\351\233\250\346\260\264/main.go" new file mode 100644 index 00000000..f788be50 --- /dev/null +++ "b/week01/\346\216\245\351\233\250\346\260\264/main.go" @@ -0,0 +1,42 @@ +package main + +//https://leetcode-cn.com/problems/trapping-rain-water/ + +//这个题有点搞不懂get到题的核心 +//所以第一次完成看答案去反查如何解决问题 + +// 先用自己好理解的双指针法,这点跟寻找最大的面积那道题不一样 +// 我们得首先明白,木桶原理,当前容纳得面积得按照最小的处理 + +//输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] +// 输出:6 +func trap(height []int) int { + var left, right = 0, len(height) - 1 + var result, leftMax, rightMax int + for left < right { + if height[left] < height[right] { + if height[left] >= leftMax { + //设置左边最高柱子 + leftMax = height[left] + } else { + //右边必定有柱子挡水,所以,遇到所有值小于等于leftMax的,全部加入水池 + result += leftMax - height[left] + } + left++ + } else { + if height[right] > rightMax { + //设置右边最高柱子 + rightMax = height[right] + } else { + //左边必定有柱子挡水,所以,遇到所有值小于等于rightMax的,全部加入水池 + result += rightMax - height[right] + } + right-- + } + } + return result +} + +func main() { + trap([]int{0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}) +} diff --git "a/week01/\346\227\213\350\275\254\346\225\260\347\273\204/main.go" "b/week01/\346\227\213\350\275\254\346\225\260\347\273\204/main.go" new file mode 100644 index 00000000..aa93e20f --- /dev/null +++ "b/week01/\346\227\213\350\275\254\346\225\260\347\273\204/main.go" @@ -0,0 +1,42 @@ +package main + +import "fmt" + +//给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数 + +// 示例 1: + +// 输入: [1,2,3,4,5,6,7] 和 k = 3 +// 输出: [5,6,7,1,2,3,4] +// 解释: +// 向右旋转 1 步: [7,1,2,3,4,5,6] +// 向右旋转 2 步: [6,7,1,2,3,4,5] +// 向右旋转 3 步: [5,6,7,1,2,3,4] + +// 说明: + +// 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 +// 要求使用空间复杂度为 O(1) 的 原地 算法。 + +//1 暴力破解法 也不能立刻做出来 +//2 环形结构,如何移动 +//2.1 边界条件 不太能立刻get到 + +//3 反转数组 +func rotate(nums []int, k int) { + k %= len(nums) + reverse(nums, 0, len(nums)-1) + reverse(nums, 0, k-1) + reverse(nums, k, len(nums)-1) +} +func reverse(nums []int, start, end int) { + for start < end { + nums[start], nums[end] = nums[end], nums[start] + start++ + end-- + } +} + +func main() { + fmt.Print(7 % 3) +} diff --git "a/week01/\347\247\273\345\212\2500/main.go" "b/week01/\347\247\273\345\212\2500/main.go" new file mode 100644 index 00000000..38c7115b --- /dev/null +++ "b/week01/\347\247\273\345\212\2500/main.go" @@ -0,0 +1,25 @@ +package main + +//必须在原数组上操作,不能拷贝额外的数组。 +// 尽量减少操作次数。 + +//以前可能会想用额外的数组处理 + +// 示例: + +// 输入: [0,1,0,3,12] +// 输出: [1,3,12,0,0] +func moveZeroes(nums []int) { + j := 0 + for i := 0; i < len(nums); i++ { + //犯了个错,没考虑到负数情况 + if nums[i] != 0 { + nums[j], nums[i] = nums[i], nums[j] + j++ + } + } +} + +func main() { + +} From 6ce0c070814fb5fa4a9197b689c2b3dfad66b2f6 Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 1 Nov 2020 19:31:00 +0800 Subject: [PATCH 03/17] xiao --- "week02/HashMap\346\200\273\347\273\223.md" | 14 +++++ week02/NOTE.md | 8 ++- .../main.go" | 25 ++++++++ .../main.go" | 33 +++++++++++ "week02/\344\270\221\346\225\260/ugly.go" | 40 +++++++++++++ .../main.go" | 17 ++++++ .../tree.go" | 59 +++++++++++++++++++ .../main.go" | 53 +++++++++++++++++ .../main.go" | 39 ++++++++++++ .../main.go" | 20 +++++++ 10 files changed, 307 insertions(+), 1 deletion(-) create mode 100644 "week02/HashMap\346\200\273\347\273\223.md" create mode 100644 "week02/N\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206/main.go" create mode 100644 "week02/N\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206/main.go" create mode 100644 "week02/\344\270\221\346\225\260/ugly.go" create mode 100644 "week02/\344\270\244\346\225\260\344\271\213\345\222\214/main.go" create mode 100644 "week02/\344\272\214\345\217\211\346\240\221\345\211\215\345\272\217\344\270\255\345\272\217/tree.go" create mode 100644 "week02/\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240/main.go" create mode 100644 "week02/\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/main.go" create mode 100644 "week02/\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215/main.go" diff --git "a/week02/HashMap\346\200\273\347\273\223.md" "b/week02/HashMap\346\200\273\347\273\223.md" new file mode 100644 index 00000000..151acdde --- /dev/null +++ "b/week02/HashMap\346\200\273\347\273\223.md" @@ -0,0 +1,14 @@ +## HashMap + +### 实现方式 + +- 数据+链表 +> 用链地址去解决hash冲突的问题 +- 红黑树 + +> 当map增长到指定的阈值的时候,数组就不适用了,升高维度进化为树。但因为对树了解不太多,等后面学完再补充 +### 解决问题 + +- 访问只需要o(1)的时间复杂度 + +- 常作为缓存使用 \ No newline at end of file diff --git a/week02/NOTE.md b/week02/NOTE.md index 50de3041..fcba002f 100644 --- a/week02/NOTE.md +++ b/week02/NOTE.md @@ -1 +1,7 @@ -学习笔记 \ No newline at end of file +## 问题 + +- 使用golang封装的堆处理问题,但是不太熟练,还需练习 +- dfs+bfs有待琢磨下,算法模板还是挺有趣的 + +## 脑图在修改中 +- 预计11-08号完成前两章的脑图 diff --git "a/week02/N\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206/main.go" "b/week02/N\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206/main.go" new file mode 100644 index 00000000..a490c57f --- /dev/null +++ "b/week02/N\345\217\211\346\240\221\347\232\204\345\211\215\345\272\217\351\201\215\345\216\206/main.go" @@ -0,0 +1,25 @@ +package main + +type Node struct { + Val int + Children []*Node +} + +//N叉树的前序遍历 +//root->left-> right +//root->孩子 +func preorder(root *Node) (result []int) { + var order func(root *Node) + + order = func(root *Node) { + if root != nil { + result = append(result, root.Val) + for _, value := range root.Children { + order(value) + } + } + } + order(root) + return nil + +} diff --git "a/week02/N\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206/main.go" "b/week02/N\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206/main.go" new file mode 100644 index 00000000..ce47e0f6 --- /dev/null +++ "b/week02/N\345\217\211\346\240\221\347\232\204\345\261\202\345\272\217\351\201\215\345\216\206/main.go" @@ -0,0 +1,33 @@ +package main + +type Node struct { + Val int + Children []*Node +} + +func levelOrder(root *Node) [][]int { + res := [][]int{} + if root == nil { + return nil + } + dfs(root, 0, &res) + return res +} + +//题目看着挺吓人,不过记住规则就好 深度遍历 +func dfs(root *Node, level int, res *[][]int) { + if root == nil { + return + } + if len(*res) == level { + *res = append(*res, []int{}) + } + (*res)[level] = append((*res)[level], root.Val) + for _, n := range root.Children { + dfs(n, level+1, res) + } +} + +func main() { + +} diff --git "a/week02/\344\270\221\346\225\260/ugly.go" "b/week02/\344\270\221\346\225\260/ugly.go" new file mode 100644 index 00000000..99842d20 --- /dev/null +++ "b/week02/\344\270\221\346\225\260/ugly.go" @@ -0,0 +1,40 @@ +package main + +// 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 + +//这个题有点难理解,不过只要理解题意做还是挺方便的 2* 3* 5* 第n个数一定是这些之中的一个,并且会排序从小到大 +//定义一个数组存放所有的丑数 +//所以这就是动态规划? +func min(x, y int) int { + if x < y { + return x + } + return y +} + +func nthUglyNumber(n int) int { + //创建3个索引指针 + var a, b, c int + result := make([]int, n, n) + result[0] = 1 + for i := 1; i < n; i++ { + result[i] = min(result[c]*5, min(result[a]*2, result[b]*3)) + + //每次都选择最小的值 + if result[i] == result[a]*2 { + a++ + } + if result[i] == result[b]*3 { + b++ + } + if result[i] == result[c]*5 { + c++ + } + + } + return result[n-1] +} + +func main() { + +} diff --git "a/week02/\344\270\244\346\225\260\344\271\213\345\222\214/main.go" "b/week02/\344\270\244\346\225\260\344\271\213\345\222\214/main.go" new file mode 100644 index 00000000..e5a395c5 --- /dev/null +++ "b/week02/\344\270\244\346\225\260\344\271\213\345\222\214/main.go" @@ -0,0 +1,17 @@ +package main + +//已经做过的题 +func twoSum(nums []int, target int) []int { + hashTable := map[int]int{} + for i, x := range nums { + if p, ok := hashTable[target-x]; ok { + return []int{p, i} + } + hashTable[x] = i + } + return nil +} + +func main() { + +} diff --git "a/week02/\344\272\214\345\217\211\346\240\221\345\211\215\345\272\217\344\270\255\345\272\217/tree.go" "b/week02/\344\272\214\345\217\211\346\240\221\345\211\215\345\272\217\344\270\255\345\272\217/tree.go" new file mode 100644 index 00000000..1152e0c8 --- /dev/null +++ "b/week02/\344\272\214\345\217\211\346\240\221\345\211\215\345\272\217\344\270\255\345\272\217/tree.go" @@ -0,0 +1,59 @@ +package tree + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +//中序遍历 left-root-right +func inorderTraversal(root *TreeNode) (result []int) { + var order func(root *TreeNode) + + order = func(root *TreeNode) { + if root != nil { + order(root.Left) + result = append(result, root.Val) + order(root.Right) + + } + } + order(root) + return nil +} + +//前序遍历 root-left-right +func preorderTraversal(root *TreeNode) (result []int) { + var order func(root *TreeNode) + + order = func(root *TreeNode) { + if root != nil { + result = append(result, root.Val) + order(root.Left) + order(root.Right) + } + } + order(root) + return nil + +} + +// class Solution { + +// private List> result = new ArrayList<>(); + +// public List> levelOrder(Node root) { +// if (root != null) traverseNode(root, 0); +// return result; +// } + +// private void traverseNode(Node node, int level) { +// if (result.size() <= level) { +// result.add(new ArrayList<>()); +// } +// result.get(level).add(node.val); +// for (Node child : node.children) { +// traverseNode(child, level + 1); +// } +// } +// } diff --git "a/week02/\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240/main.go" "b/week02/\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240/main.go" new file mode 100644 index 00000000..6c04b596 --- /dev/null +++ "b/week02/\345\211\215K\344\270\252\351\253\230\351\242\221\345\205\203\347\264\240/main.go" @@ -0,0 +1,53 @@ +package main + +import ( + "container/heap" + "fmt" +) + +// 给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 + +//想到了用堆来解决 + +//前K个频率高的元素 +func topKFrequent(nums []int, k int) []int { + mc := make(map[int]int) + for _, value := range nums { + mc[value]++ + } + + h := &head{} + heap.Init(h) + + for key, value := range mc { + heap.Push(h, [2]int{key, value}) + if h.Len() > k { + heap.Pop(h) + } + } + ret := make([]int, k) + for i := 0; i < k; i++ { + ret[k-i-1] = heap.Pop(h).([2]int)[0] + } + return ret +} + +type head [][2]int + +func (h head) Len() int { return len(h) } +func (h head) Less(i, j int) bool { return h[i][1] < h[j][1] } +func (h head) Swap(i, j int) { h[i], h[j] = h[j], h[i] } + +func (h *head) Push(x interface{}) { + *h = append(*h, x.([2]int)) +} + +func (h *head) Pop() interface{} { + x := (*h)[h.Len()-1] + *h = (*h)[:h.Len()-1] + return x +} + +func main() { + fmt.Print(topKFrequent([]int{1, 2}, 2)) +} diff --git "a/week02/\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/main.go" "b/week02/\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/main.go" new file mode 100644 index 00000000..1446aaa4 --- /dev/null +++ "b/week02/\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/main.go" @@ -0,0 +1,39 @@ +package main + +import "sort" + +type bytes []byte + +// 自定义排序规则 +func (b bytes) Len() int { + return len(b) +} +func (b bytes) Less(i, j int) bool { + return b[i] < b[j] +} +func (b bytes) Swap(i, j int) { + b[i], b[j] = b[j], b[i] +} + +func groupAnagrams(strs []string) [][]string { + var result [][]string + mk := make(map[string]int) + + for _, str := range strs { + //没有提供合适的方法,重写了 + temp := bytes(str) + sort.Sort(temp) // 将字符串排序 + k := string(temp) + if idx, ok := mk[k]; !ok { + mk[k] = len(result) + result = append(result, []string{str}) + } else { + result[idx] = append(result[idx], str) + } + } + return result +} + +func main() { + +} diff --git "a/week02/\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215/main.go" "b/week02/\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215/main.go" new file mode 100644 index 00000000..4f3a19c1 --- /dev/null +++ "b/week02/\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215/main.go" @@ -0,0 +1,20 @@ +package main + +//什么是异位词 +//输入是通过将 s 的字母重新排列成 t 来生成变位词。 +// 因此,如果 t 是 s 的变位词,对两个字符串进行排序将产生两个相同的字符串。 +//Map解决 又快又好用 +func isAnagram(s string, t string) bool { + m := make(map[rune]int) + for _, value := range s { + m[value]++ + } + for _, value := range t { + m[value]-- + } + return len(m) == 0 +} + +func main() { + +} From 0f2695020ba3920f768a8ece13e7bb11c618624c Mon Sep 17 00:00:00 2001 From: carl-Xiao <270555686@qq.com> Date: Mon, 2 Nov 2020 08:31:48 +0800 Subject: [PATCH 04/17] xx --- week02/NOTE.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/week02/NOTE.md b/week02/NOTE.md index 50de3041..433dc5c9 100644 --- a/week02/NOTE.md +++ b/week02/NOTE.md @@ -1 +1,3 @@ -学习笔记 \ No newline at end of file +## 树 + +所有数的处理,递归是核心 \ No newline at end of file From a9023619f13664607c9575713b0aa9f942a27241 Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 8 Nov 2020 20:20:10 +0800 Subject: [PATCH 05/17] add --- week03/NOTE.md | 7 ++- .../main.go" | 36 +++++++++++ .../main.go" | 63 +++++++++++++++++++ .../main.go" | 43 +++++++++++++ .../main.go" | 31 +++++++++ "week03/\347\273\204\345\220\210/main.go" | 35 +++++++++++ 6 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 "week03/\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210/main.go" create mode 100644 "week03/\344\273\216\345\211\215\345\272\217\344\270\216\344\270\255\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221/main.go" create mode 100644 "week03/\345\205\250\346\216\222\345\210\227/main.go" create mode 100644 "week03/\345\205\250\346\216\222\345\210\2272/main.go" create mode 100644 "week03/\347\273\204\345\220\210/main.go" diff --git a/week03/NOTE.md b/week03/NOTE.md index 50de3041..04c6555b 100644 --- a/week03/NOTE.md +++ b/week03/NOTE.md @@ -1 +1,6 @@ -学习笔记 \ No newline at end of file +# 心得 + +这周东西确实花时间相对较少,又遇到了这种递归回溯法。发现与解决二叉树感觉如果进入了新的世界,在国际站上找到了一些比较优秀的解法。参考才能完成当前的作业 + + +加油把~~day day up \ No newline at end of file diff --git "a/week03/\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210/main.go" "b/week03/\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210/main.go" new file mode 100644 index 00000000..1c85baaf --- /dev/null +++ "b/week03/\344\272\214\345\217\211\346\240\221\347\232\204\346\234\200\350\277\221\345\205\254\345\205\261\347\245\226\345\205\210/main.go" @@ -0,0 +1,36 @@ +// 236题目 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 + +// 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。 +package main + +//TreeNode 根节点 +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +//分析 +// 从左+从右 一起找 +// 假设节点分布在左边与右边,就返回当前root + +// 如果排列在一边 则只返回q或者q的一个节点即可 +func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode { + //边界情况 + if root == nil || root == p || root == q { + return root + } + + //进入下一层 + left := lowestCommonAncestor(root.Left, p, q) + right := lowestCommonAncestor(root.Right, p, q) + + //处理逻辑 + if left == nil { + return right + } else if right == nil { + return left + } else { + return root + } +} diff --git "a/week03/\344\273\216\345\211\215\345\272\217\344\270\216\344\270\255\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221/main.go" "b/week03/\344\273\216\345\211\215\345\272\217\344\270\216\344\270\255\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221/main.go" new file mode 100644 index 00000000..01fdea40 --- /dev/null +++ "b/week03/\344\273\216\345\211\215\345\272\217\344\270\216\344\270\255\345\272\217\351\201\215\345\216\206\345\272\217\345\210\227\346\236\204\351\200\240\344\272\214\345\217\211\346\240\221/main.go" @@ -0,0 +1,63 @@ +package main + +//TreeNode 根节点 +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +// 根据一棵树的前序遍历与中序遍历构造二叉树。 + +// 注意: +// 你可以假设树中没有重复的元素。 + +// 例如,给出 + +// 前序遍历 preorder = [3,9,20,15,7] +// 中序遍历 inorder = [9,3,15,20,7] + +//分析 + +//1 前序第一个点 就是根节点 +//2 通过根节点将 将中序遍历的数组分成两部分 left right + +// 3 +// / \ +// 9 20 +// / \ +// 15 7 +//第一次 从前序找到根节点 1 中序 left 4 2 5 right 3 + +//所以问题变成了 如何合理拆分 +//left 前序 start,start+左子树的长度 中序 start ,根节点-1 +//right 前序 start+左子树的长度+1 end 中序 根节点+1 end + +func buildTree(preorder []int, inorder []int) *TreeNode { + ma := make(map[int]int) + + for i := 0; i < len(inorder); i++ { + ma[inorder[i]] = i + } + + var a func(preorder []int, preStart, preEnd int, inorder []int, inStart, inEnd int, ma map[int]int) *TreeNode + + a = func(preorder []int, preStart, preEnd int, inorder []int, inStart, inEnd int, inMap map[int]int) *TreeNode { + //跳出递归的条件 前序或者中序的整个数据长度遍历完 + if preStart > preEnd || inStart > inEnd { + return nil + } + root := &TreeNode{Val: preorder[preStart]} + inorderRoot := ma[root.Val] + //左子树的长度 + leftTreeLen := inorderRoot - inStart + + root.Left = a(preorder, preStart+1, preStart+leftTreeLen, inorder, inStart, inorderRoot-1, inMap) + //preStart+leftTreeLen+1 有点不懂先记录着回看再想明白 + root.Right = a(preorder, preStart+leftTreeLen+1, preEnd, inorder, inorderRoot+1, inEnd, inMap) + + return root + } + + return a(preorder, 0, len(preorder)-1, inorder, 0, len(inorder)-1, ma) +} diff --git "a/week03/\345\205\250\346\216\222\345\210\227/main.go" "b/week03/\345\205\250\346\216\222\345\210\227/main.go" new file mode 100644 index 00000000..d494a771 --- /dev/null +++ "b/week03/\345\205\250\346\216\222\345\210\227/main.go" @@ -0,0 +1,43 @@ +package main + +// 给定一个 没有重复 数字的序列,返回其所有可能的全排列。 + +// 示例: + +// 输入: [1,2,3] +// 输出: +// [ +// [1,2,3], +// [1,3,2], +// [2,1,3], +// [2,3,1], +// [3,1,2], +// [3,2,1] +// ] + +// 从国际版找到的一个比较好的解决办法 +// 自己写总是会出现bug + +func permute(nums []int) [][]int { + result := &[][]int{} + dfs(0, nums, result) + return *result +} + +func dfs(start int, nums []int, results *[][]int) { + if start == len(nums) { + tmp := make([]int, len(nums)) + copy(tmp, nums) + *results = append(*results, tmp) + return + } + for i := start; i < len(nums); i++ { + nums[i], nums[start] = nums[start], nums[i] + dfs(start+1, nums, results) + nums[i], nums[start] = nums[start], nums[i] + } +} + +func main() { + +} diff --git "a/week03/\345\205\250\346\216\222\345\210\2272/main.go" "b/week03/\345\205\250\346\216\222\345\210\2272/main.go" new file mode 100644 index 00000000..5f3c307f --- /dev/null +++ "b/week03/\345\205\250\346\216\222\345\210\2272/main.go" @@ -0,0 +1,31 @@ +package main + +//比上面多了一个判断是否重复的就可以了 +func permuteUnique(nums []int) [][]int { + result := &[][]int{} + dfs(0, 1, nums, result) + return *result +} + +func dfs(start, k int, nums []int, results *[][]int) { + if k == len(nums) { + tmp := make([]int, len(nums)) + copy(tmp, nums) + *results = append(*results, tmp) + return + } + used := make(map[int]int) + for i := start; i < len(nums); i++ { + if _, ok := used[nums[i]]; ok { + continue + } + nums[i], nums[start] = nums[start], nums[i] + dfs(start+1, k+1, nums, results) + nums[i], nums[start] = nums[start], nums[i] + used[nums[i]] = i + } +} + +func main() { + +} diff --git "a/week03/\347\273\204\345\220\210/main.go" "b/week03/\347\273\204\345\220\210/main.go" new file mode 100644 index 00000000..ee954f56 --- /dev/null +++ "b/week03/\347\273\204\345\220\210/main.go" @@ -0,0 +1,35 @@ +package main + +import "fmt" + +//NO 77 +//给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 +// 心里是蒙蔽的,咋的这递归完全就不一样了,思考方式都不同了 +// 看了第三遍的题解 有一点点感觉,但还是理解不了 +func combine(n int, k int) [][]int { + results := [][]int{} + if k > n { + return results + } + + dfs(n, k, 1, []int{}, &results) + return results +} + +func dfs(n int, k, begin int, buf []int, results *[][]int) { + if k == 0 { + tmp := make([]int, len(buf)) + copy(tmp, buf) + *results = append(*results, tmp) + return + } + for i := begin; i <= n; i++ { + buf = append(buf, i) + dfs(n, k-1, i+1, buf, results) + buf = buf[:len(buf)-1] + } +} + +func main() { + fmt.Println(combine(4, 2)) +} From 4d71ed0172fd6d5bdaa2e24096eee654a5379dc2 Mon Sep 17 00:00:00 2001 From: carl-Xiao <270555686@qq.com> Date: Mon, 9 Nov 2020 09:06:05 +0800 Subject: [PATCH 06/17] add --- week03/NOTE.md | 40 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/week03/NOTE.md b/week03/NOTE.md index 04c6555b..96a262eb 100644 --- a/week03/NOTE.md +++ b/week03/NOTE.md @@ -3,4 +3,42 @@ 这周东西确实花时间相对较少,又遇到了这种递归回溯法。发现与解决二叉树感觉如果进入了新的世界,在国际站上找到了一些比较优秀的解法。参考才能完成当前的作业 -加油把~~day day up \ No newline at end of file +加油把~~day day up + + + +## 牢记模板 + +```java +public void recur(int level, int param) { + // terminator + if (level > MAX_LEVEL) { + // process result + return; + } + // process current logic + process(level, param); + // drill down + recur( level: level + 1, newParam); + // restore current status + +} +``` +- 找到当前层的边界值 +- 处理当前层的逻辑 +- 接着向下走 +```golang + +func recur(level int ,parm int){ + // terminator + if level > MAX_LEVEL { + // process result + return; + } + // process current logic + process(level, param); + // drill down + recur(level + 1, newParam); + // restore current status +} +``` \ No newline at end of file From 248c8a131248764f7bcaef6c7d26a5b53ec33b1b Mon Sep 17 00:00:00 2001 From: carl-Xiao <270555686@qq.com> Date: Sat, 14 Nov 2020 17:18:53 +0800 Subject: [PATCH 07/17] add --- .../main.go" | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 "week04/\345\262\233\345\261\277\346\225\260\351\207\217/main.go" diff --git "a/week04/\345\262\233\345\261\277\346\225\260\351\207\217/main.go" "b/week04/\345\262\233\345\261\277\346\225\260\351\207\217/main.go" new file mode 100644 index 00000000..4a22fda1 --- /dev/null +++ "b/week04/\345\262\233\345\261\277\346\225\260\351\207\217/main.go" @@ -0,0 +1,38 @@ +package main + +import "fmt" + +// 200. 岛屿数量 +// 给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。 + +//dfs深度优先遍历 + +func numIslands(grid [][]byte) int { + count := 0 + for i := 0; i < len(grid); i++ { + for j := 0; j < len(grid[i]); j++ { + if grid[i][j] == '1' { + count++ + fmt.Println(count) + dfs(i, j, grid) + } + + } + } + return count +} + +func dfs(i, j int, grid [][]byte) { + if i < 0 || j < 0 || i >= len(grid) || j >= len(grid[i]) || grid[i][j] == '0' { + return + } + grid[i][j] = '0' + dfs(i-1, j, grid) + dfs(i+1, j, grid) + dfs(i, j-1, grid) + dfs(i, j+1, grid) +} + +func main() { + +} From b4a6d9f36d7e7509fcfd5d9e1ae659dd5b359e8c Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 15 Nov 2020 21:25:35 +0800 Subject: [PATCH 08/17] add --- .vscode/launch.json | 2 +- .../main.go" | 18 +++ .../main.go" | 24 +++ .../main.go" | 153 ++++++++++++++++++ .../\345\217\214\345\220\221bfs.png" | Bin 0 -> 85568 bytes .../main.go" | 32 ++++ .../main.go" | 45 ++++++ .../main.go" | 55 +++++++ .../main.go" | 22 +++ .../main.go" | 51 ++++++ .../main.go" | 31 ++++ 11 files changed, 432 insertions(+), 1 deletion(-) create mode 100644 "week04/\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272 II/main.go" create mode 100644 "week04/\345\210\206\345\217\221\351\245\274\345\271\262/main.go" create mode 100644 "week04/\345\215\225\350\257\215\346\216\245\351\276\231/main.go" create mode 100644 "week04/\345\215\225\350\257\215\346\216\245\351\276\231/\345\217\214\345\220\221bfs.png" create mode 100644 "week04/\345\215\225\350\257\215\346\216\245\351\276\231II/main.go" create mode 100644 "week04/\345\257\273\346\211\276\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204\344\270\255\347\232\204\346\234\200\345\260\217\345\200\274/main.go" create mode 100644 "week04/\346\211\253\351\233\267\346\270\270\346\210\217/main.go" create mode 100644 "week04/\346\216\242\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/main.go" create mode 100644 "week04/\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/main.go" create mode 100644 "week04/\346\237\240\346\252\254\351\205\270\346\211\276\351\233\266/main.go" diff --git a/.vscode/launch.json b/.vscode/launch.json index d95d6544..ae049917 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,7 +6,7 @@ "type": "go", "request": "launch", "mode": "debug", - "program": "D:\\algorithm018\\week01\\接雨水\\main.go", + "program": "D:\\golang\\algorithm018\\week04\\单词接龙\\main.go", "showLog": true } ] diff --git "a/week04/\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272 II/main.go" "b/week04/\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272 II/main.go" new file mode 100644 index 00000000..0564e336 --- /dev/null +++ "b/week04/\344\271\260\345\215\226\350\202\241\347\245\250\347\232\204\346\234\200\344\275\263\346\227\266\346\234\272 II/main.go" @@ -0,0 +1,18 @@ +package main + +// 122. 买卖股票的最佳时机 II + +//这个题就是期望今天一直比昨天的行情好 +func maxProfit(prices []int) (ans int) { + for i := 1; i < len(prices); i++ { + ans += max(0, prices[i]-prices[i-1]) + } + return +} + +func max(a, b int) int { + if a > b { + return a + } + return b +} diff --git "a/week04/\345\210\206\345\217\221\351\245\274\345\271\262/main.go" "b/week04/\345\210\206\345\217\221\351\245\274\345\271\262/main.go" new file mode 100644 index 00000000..0aa17db1 --- /dev/null +++ "b/week04/\345\210\206\345\217\221\351\245\274\345\271\262/main.go" @@ -0,0 +1,24 @@ +package main + +import ( + "fmt" + "sort" +) + +// 455. 分发饼干 + +//先排序 然后两个数组依次配对 +func findContentChildren(g []int, s []int) int { + sort.Ints(g) + sort.Ints(s) + fmt.Print(g) + fmt.Print(s) + i, j := 0, 0 + for i < len(g) && j < len(s) { + if g[i] <= s[j] { + i++ + } + j++ + } + return i +} diff --git "a/week04/\345\215\225\350\257\215\346\216\245\351\276\231/main.go" "b/week04/\345\215\225\350\257\215\346\216\245\351\276\231/main.go" new file mode 100644 index 00000000..bf9dfcf2 --- /dev/null +++ "b/week04/\345\215\225\350\257\215\346\216\245\351\276\231/main.go" @@ -0,0 +1,153 @@ +package main + +import ( + "fmt" +) + +// 127. 单词接龙 + +// 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则: + +// 每次转换只能改变一个字母。 +// 转换过程中的中间单词必须是字典中的单词。 +// 说明: + +// 如果不存在这样的转换序列,返回 0。 +// 所有单词具有相同的长度。 +// 所有单词只由小写字母组成。 +// 字典中不存在重复的单词。 +// 你可以假设 beginWord 和 endWord 是非空的,且二者不相同。 + +// 示例 1: + +// 输入: +// beginWord = "hit", +// endWord = "cog", +// wordList = ["hot","dot","dog","lot","log","cog"] +//"hot", "dot", "dog", "lot", "log" + +// 输出: 5 + +// 解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", +// 返回它的长度 5。 + +// 耗时3小时+ + +//问题 1 单向递归被判超时,不知道是什么机制 +//问题 2 对golang的使用出现了致命的失误 + +//问题3 当遇到这种测试的时候出现问题 +//"ymain" +// "oecij" +// ["ymann","yycrj","oecij","ymcnj","yzcrj","yycij","xecij","yecij","ymanj","yzcnj","ymain"] + +//总之在个题耗费 2020-11-15一下午的时间 +func main() { + fmt.Println(ladderLength("ymain", "oecij", []string{"ymann", "yycrj", "oecij", "ymcnj", "yzcrj", "yycij", "xecij", "yecij", "ymanj", "yzcnj", "ymain"})) + + // fmt.Println(ladderLength("hit", "cog", []string{"hot", "dot", "dog", "lot", "log", "cog"})) +} + +func ladderLength(beginWord string, endWord string, wordList []string) int { + wordmap := make(map[string]bool) + for _, value := range wordList { + wordmap[value] = true + } + if _, ok := wordmap[endWord]; !ok { + return 0 + } + + visited := make(map[string]bool) + beginqueue := new([]string) + endqueue := new([]string) + *beginqueue = append(*beginqueue, beginWord) + *endqueue = append(*endqueue, endWord) + + if _, ok := wordmap[beginWord]; ok { + delete(wordmap, beginWord) + } + + count := 1 + for len(*beginqueue) > 0 && len(*endqueue) > 0 { + res := find(count, beginqueue, endqueue, visited, wordmap) + + if res != -1 { + return res + } + count++ + } + return 0 +} +func find(min int, beginqueue, endqueue *[]string, visited, dict map[string]bool) int { + var count int + pre := false + start := len(*beginqueue) + end := len(*endqueue) + + if start <= end { + count = start + pre = true + } else { + count = end + } + fmt.Println(*beginqueue, *endqueue, visited, count, pre) + + for i := 0; i < count; i++ { + var value string + if pre { + value = (*beginqueue)[0] + *beginqueue = (*beginqueue)[1:] + } else { + value = (*endqueue)[0] + *endqueue = (*endqueue)[1:] + } + chs := []byte(value) + for j := 0; j < len(chs); j++ { + for c := 'a'; c <= 'z'; c++ { + if byte(c) == chs[j] { + continue + } + old := chs[j] + chs[j] = byte(c) + target := string(chs) + if _, ok := dict[target]; ok { + if pre { + if contains(*endqueue, target) { + // fmt.Println(pre, *endqueue, target) + return min + 1 + } + ok := visited[target] + if !ok { + *beginqueue = append(*beginqueue, target) + visited[target] = true + } + + } else { + if contains(*beginqueue, target) { + fmt.Println(*beginqueue, target) + return min + 1 + } + ok := visited[target] + if !ok { + *endqueue = append(*endqueue, target) + visited[target] = true + } + + } + } + + chs[j] = old + } + } + } + return -1 +} + +func contains(word []string, taget string) bool { + for _, value := range word { + if value == taget { + return true + } + } + return false +} diff --git "a/week04/\345\215\225\350\257\215\346\216\245\351\276\231/\345\217\214\345\220\221bfs.png" "b/week04/\345\215\225\350\257\215\346\216\245\351\276\231/\345\217\214\345\220\221bfs.png" new file mode 100644 index 0000000000000000000000000000000000000000..b56f86c04d41577cc191569f49caed4af689d4fd GIT binary patch literal 85568 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�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 nums[0] { + return nums[0] + + } + for left <= right { + mid := (left + right) / 2 + if nums[mid] > nums[mid+1] { + return nums[mid+1] + } + if nums[mid-1] > nums[mid] { + return nums[mid] + } + if nums[mid] > nums[0] { + left = mid + 1 + } else { + right = mid - 1 + } + fmt.Println(left, right, mid) + } + return -1 +} + +func main() { + fmt.Println(findMin([]int{4, 5, 6, 7})) +} diff --git "a/week04/\346\211\253\351\233\267\346\270\270\346\210\217/main.go" "b/week04/\346\211\253\351\233\267\346\270\270\346\210\217/main.go" new file mode 100644 index 00000000..5bb6336d --- /dev/null +++ "b/week04/\346\211\253\351\233\267\346\270\270\346\210\217/main.go" @@ -0,0 +1,55 @@ +package main + +//dfs 题目 +//上下左右斜线的8个方法 ,这个是需要dfs 判断当前是否需要改变 +var dx = []int{-1, 0, 1, -1, 1, 0, 1, -1} +var dy = []int{-1, 1, 1, 0, -1, -1, 0, 1} + +func updateBoard(board [][]byte, click []int) [][]byte { + x := click[0] + y := click[1] + //遇到炸弹直接返回 + if board[x][y] == 'M' { + board[x][y] = 'X' + return board + } + dfs(board, x, y) + return board +} + +func dfs(board [][]byte, x, y int) { + if x < 0 || x >= len(board) || y < 0 || y >= len(board[0]) || board[x][y] != 'E' { + return + } + num := getNumsOfBombs(board, x, y) + if num == 0 { + board[x][y] = 'B' + for i := 0; i < 8; i++ { + nx := x + dx[i] + ny := y + dy[i] + dfs(board, nx, ny) + } + } else { + board[x][y] = byte('0' + num) + } +} + +func getNumsOfBombs(board [][]byte, x, y int) int { + + num := 0 + for i := 0; i < 8; i++ { + nx := x + dx[i] + ny := y + dy[i] + if nx < 0 || nx >= len(board) || ny < 0 || ny >= len(board[0]) { + continue + } + if board[nx][ny] == 'M' || board[nx][ny] == 'X' { + num++ + } + } + return num +} + +func main() { + +} diff --git "a/week04/\346\216\242\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/main.go" "b/week04/\346\216\242\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/main.go" new file mode 100644 index 00000000..a5c6a81c --- /dev/null +++ "b/week04/\346\216\242\347\264\242\344\272\214\347\273\264\347\237\251\351\230\265/main.go" @@ -0,0 +1,22 @@ +package main + +//74. 搜索二维矩阵 + +//感觉这题与二分也没什么关系 +func searchMatrix(matrix [][]int, target int) bool { + if len(matrix) == 0 || len(matrix[0]) == 0 { + return false + } + colum := len(matrix[0]) - 1 + for row := 0; row < len(matrix); row++ { + if matrix[row][colum] >= target { + for i := 0; i <= colum; i++ { + if matrix[row][i] == target { + return true + } + } + return false + } + } + return false +} diff --git "a/week04/\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/main.go" "b/week04/\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/main.go" new file mode 100644 index 00000000..017f5174 --- /dev/null +++ "b/week04/\346\220\234\347\264\242\346\227\213\350\275\254\346\216\222\345\272\217\346\225\260\347\273\204/main.go" @@ -0,0 +1,51 @@ +package main + +import "fmt" + +//33. 搜索旋转排序数组 + +// 给你一个整数数组 nums ,和一个整数 target 。 + +// 该整数数组原本是按升序排列,但输入时在预先未知的某个点上进行了旋转。(例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。 + +// 请你在数组中搜索 target ,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。 + +//二分查找 +//输入:nums = [4,5,6,7,0,1,2], target = 0 +// 输出:4 + +//代码有些冗余,但是自己能很好理解 +func search(nums []int, target int) int { + left := 0 + right := len(nums) - 1 + + for left <= right { + + mid := (left + right) / 2 + if nums[mid] == target { + return mid + } + fmt.Println(left, right) + + //按照当前例子,前半段是正常的 后半段是异常 + if nums[mid] >= nums[left] { + if target >= nums[left] && target < nums[mid] { + right = mid - 1 + } else { + left = mid + 1 + } + } else { + if target <= nums[right] && target > nums[mid] { + left = mid + 1 + } else { + right = mid - 1 + } + } + + } + return -1 +} + +func main() { + fmt.Println(search([]int{5, 1, 3}, 5)) +} diff --git "a/week04/\346\237\240\346\252\254\351\205\270\346\211\276\351\233\266/main.go" "b/week04/\346\237\240\346\252\254\351\205\270\346\211\276\351\233\266/main.go" new file mode 100644 index 00000000..6be31534 --- /dev/null +++ "b/week04/\346\237\240\346\252\254\351\205\270\346\211\276\351\233\266/main.go" @@ -0,0 +1,31 @@ +package main + +// 860. 柠檬水找零 + +// 题意一开始误解了,应该是挺简单的题目 +func lemonadeChange(bills []int) bool { + five := 0 + ten := 0 + for _, value := range bills { + if value == 5 { + five++ + } else if value == 10 { + if five >= 1 { + five-- + ten++ + } else { + return false + } + } else if value == 20 { + if five >= 1 && ten >= 1 { + five-- + ten-- + } else if five >= 3 { + five -= 3 + } else { + return false + } + } + } + return true +} From a5e9cd4ace0ba37787c3394fc4eaa8c30769c180 Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 15 Nov 2020 21:29:33 +0800 Subject: [PATCH 09/17] add --- week04/NOTE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/week04/NOTE.md b/week04/NOTE.md index 50de3041..9d341117 100644 --- a/week04/NOTE.md +++ b/week04/NOTE.md @@ -1 +1 @@ -学习笔记 \ No newline at end of file +整体而言,有几个题很难理解。有点死磕题目了,导致后续没有完成全部内容。都只刷了一遍题目 From 511624460495ee7ef23830fd62da28f73ac9db2b Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 29 Nov 2020 16:36:44 +0800 Subject: [PATCH 10/17] add --- week06/64.go | 41 +++++++++++++++++++++++++++++++++++++++++ week06/91.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 week06/64.go create mode 100644 week06/91.go diff --git a/week06/64.go b/week06/64.go new file mode 100644 index 00000000..207089d2 --- /dev/null +++ b/week06/64.go @@ -0,0 +1,41 @@ +package main + +import "fmt" + +// 64. 最小路径和 + +// 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 + +//自底向上处理 子问题 a[i][j]=min(a[i-1][j],a[i][j-1]) + +func minPathSum(grid [][]int) int { + for i := 0; i < len(grid); i++ { + for j := 0; j < len(grid[i]); j++ { + if i == 0 && j == 0 { + continue + } else if i == 0 { + grid[i][j] = grid[i][j-1] + grid[i][j] + } else if j == 0 { + grid[i][j] = grid[i-1][j] + grid[i][j] + } else { + grid[i][j] = grid[i][j] + min(grid[i-1][j], grid[i][j-1]) + } + } + } + fmt.Println(grid) + return grid[len(grid)-1][len(grid[0])-1] +} + +func min(x, y int) int { + if x < y { + return x + } + return y +} + +func main() { + minPathSum([][]int{ + {1, 2}, + {1, 1}, + }) +} diff --git a/week06/91.go b/week06/91.go new file mode 100644 index 00000000..714fd6a3 --- /dev/null +++ b/week06/91.go @@ -0,0 +1,29 @@ +package main + +//寻找子问题,处理。证明是证明不了的 +// 当s[i] == '0', 若s[i-1]=='1'||'2', 则 dp[i] = dp[i-2] + +// 当s[i-1] == '1', dp[i] = dp[i-1] + dp[i-2] //相当于 跨一步 + 跨两步 + +//最大字母为为26 +// 当s[i-1] == '2', 若s[i]<='6', dp[i] = dp[i-1] + dp[i-2], 否则dp[i]=dp[i-1] + +func numDecodings(s string) int { + if s[0] == '0' { + return 0 + } + pre, cur := 1, 1 + for i := 1; i < len(s); i++ { + tmp := cur + if s[i] == '0' { + if s[i-1] != '1' && s[i-1] != '2' { + return 0 + } + cur = pre + } else if s[i-1] == '1' || (s[i-1] == '2' && s[i] <= '6') { + cur += pre + } + pre = tmp + } + return cur +} From 53e15eaaf97657cd5df5771d8c169bfd87351ad5 Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 29 Nov 2020 19:15:20 +0800 Subject: [PATCH 11/17] add --- week06/221.go | 40 ++++++++++++++++++++++++++++++++++++++++ week06/621.go | 5 +++++ week06/647.go | 39 +++++++++++++++++++++++++++++++++++++++ week06/91.go | 2 +- week06/dp.png | Bin 0 -> 125556 bytes 5 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 week06/221.go create mode 100644 week06/621.go create mode 100644 week06/647.go create mode 100644 week06/dp.png diff --git a/week06/221.go b/week06/221.go new file mode 100644 index 00000000..9815979a --- /dev/null +++ b/week06/221.go @@ -0,0 +1,40 @@ +package main + +// 在一个由 '0' 和 '1' 组成的二维矩阵内,找到只包含 '1' 的最大正方形,并返回其面积。 +//子问题 递推公式需要转换一下才能取值 +// 理解 min(上, 左, 左上) + 1 这个好难想到 +//https://leetcode-cn.com/problems/count-square-submatrices-with-all-ones/solution/tong-ji-quan-wei-1-de-zheng-fang-xing-zi-ju-zhen-2/ +func maximalSquare(matrix [][]byte) int { + m := len(matrix) + n := len(matrix[0]) + dp := make([][]int, len(matrix)) + maxSide := 0 + for i := 0; i < len(matrix); i++ { + dp[i] = make([]int, len(matrix[i])) + for j := 0; j < len(matrix[i]); j++ { + dp[i][j] = int(matrix[i][j] - '0') + if dp[i][j] == 1 { + maxSide = 1 + } + } + } + + for i := 1; i < m; i++ { + for j := 1; j < n; j++ { + if dp[i][j] == 1 { + dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1 + if dp[i][j] > maxSide { + maxSide = dp[i][j] + } + } + } + } + return maxSide * maxSide +} + +func min(x, y int) int { + if x < y { + return x + } + return y +} diff --git a/week06/621.go b/week06/621.go new file mode 100644 index 00000000..5106fbdc --- /dev/null +++ b/week06/621.go @@ -0,0 +1,5 @@ +package main + +func leastInterval(tasks []byte, n int) int { + +} diff --git a/week06/647.go b/week06/647.go new file mode 100644 index 00000000..fad9da07 --- /dev/null +++ b/week06/647.go @@ -0,0 +1,39 @@ +package main + +import ( + "fmt" +) + +//回文字符串的个数 + +//dp[i][j]=dp[i+1][j-1] 参考dp.png图片 + +func countSubstrings(s string) int { + if s == "" { + return 0 + } + n := len(s) + dp := make([][]bool, n) + for i := 0; i < n; i++ { + dp[i] = make([]bool, n) + } + //初始化dp + result := 0 + // + fmt.Println(dp) + for j := 0; j < n; j++ { + for i := 0; i <= j; i++ { + if i == j { + dp[i][j] = true + result++ + } else if j-i == 1 && s[i] == s[j] { + dp[i][j] = true + result++ + } else if j-i > 1 && s[i] == s[j] && dp[i+1][j-1] { + dp[i][j] = true + result++ + } + } + } + return result +} diff --git a/week06/91.go b/week06/91.go index 714fd6a3..2724da1f 100644 --- a/week06/91.go +++ b/week06/91.go @@ -1,6 +1,6 @@ package main -//寻找子问题,处理。证明是证明不了的 +//寻找子问题,处理。 // 当s[i] == '0', 若s[i-1]=='1'||'2', 则 dp[i] = dp[i-2] // 当s[i-1] == '1', dp[i] = dp[i-1] + dp[i-2] //相当于 跨一步 + 跨两步 diff --git a/week06/dp.png b/week06/dp.png new file mode 100644 index 0000000000000000000000000000000000000000..5b74634dc79c6f6620eb0bf3f4ae0e841a38ca3e GIT binary patch literal 125556 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%0DV$O8isens$2s#h0DqbXK6 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 tzz?d&RxxmC~s38Z};{ z#%t90(f*hkE1olUYFTjk?(G zo`$00+F*9|w#RaIcTuh=6wo}{}}PpOp=LpsC5-&|hV7PWmiNT#@0 zvzb~`ml?hf-SfU1yYx5v=|Ao2lOA}O!0;Z3X(9BUacRE7AZFn@3Sx17vF*_=A!Wz2 z8ybBZWY1R!#qjq=@c+WV^O8ry;oayI)> zIQgEe)dWlb;RW5-+6f7VScxQyINr^rxbnLh|9n0mAr=t=EcAlyH&;)2-XW1=I?ZMq z&2Z&-tuUolT|B;i|E@n~&Y0c$KtA4{C!lPIf<6l&WykWDT3SF^+DIY&SR=WXx>)W; z)Sd*{sG;&7R#w$flBl-wfnESF8u|ya%1;}No=Q{^14RR$S-Sm(O1N~bq8~ytWZq|% z&-B1Yqdrsy*}z{idZRWUU#|B#eAE*9^(`;Z6RX^aRAkRrb+UWy22h{5ywRh2)UBNX z45~{k)g=h7mT>$!$!y>5Rij5}^&4SYEN(jL?gA@2_tVKn=FpeW^5*g7T3{7d_i96y zx0ebCY#IIs+B#NEpH4hkawGc!BLTw9c+b2O!b9ph#?T#=ANx(LG${(rstv|gxumod zDPpzrOVa-($|&nSu>0`a?!KVXXMPO-h_i3)(z z^=&3p&n>y3IOk~8un2o}&6C!16PJ-{l~PK)swf%mU@#`asOOIEuzlz zyR<*Yl`VG*DJ^WnG<7NG`{@`oYN_t{PyO;$*)EEWQ*d$Ogr$O3apRS9vE6?#Pc0Sj zt@#vj$vI~zv1Rcj~jZYI0iFNx#!pNZQVU&y}bW612+wSrROHj_DyQgOAo z!`9L{xzQ3urDvBdt=5jzW)c{^J*0BmE)G*njey>_q|2)leOEhJBvHThed+kRnB_l$ z7@EH@!g%w9xGx=aJuh@IA*M#pF|ButK5ndp^WFSLPR!jIvcRrD1_yJ#dSWLOZO%G= z=+ZQqu@VCZ(_w*gyEHv`8|Le^5fT5f_WfLm$Lislw$4)wno@qF{^(pDl znI7@PxNNECZJX)pW2!zj;q~ak0ib13Lpc)3ER3#jMqVd@KMTXKwX33xd{FxTSfbJp z)!f>8<;X&)$$@*{9pmGXg34P~)%{y3h^7n!qp9#g9g#ITMNLleKPet-Rr>Q!IE~Xf zH0vLO{NSu3o3{S3{-d(bF@3FH9_rk-qko>K@`p@2EkV$+=x*AiROw0w!cW$$WwEi` zRAwUYYa@mwDIo`baU^&8!8ac|g*$n9(eaCUCZ^XCIX*Q=wcA(cQ+JuQ2&;`@^fhHND2zyT!{Z Date: Sun, 6 Dec 2020 20:58:12 +0800 Subject: [PATCH 12/17] update --- week07/127.go | 73 ++++++++++++++++++++++++++++++++++ week07/130.go | 45 +++++++++++++++++++++ week07/200.go | 104 +++++++++++++++++++++++++++++++++++++++++++++++++ week07/208.go | 46 ++++++++++++++++++++++ week07/22.go | 24 ++++++++++++ week07/36.go | 37 ++++++++++++++++++ week07/433.go | 44 +++++++++++++++++++++ week07/547.go | 52 +++++++++++++++++++++++++ week07/70.go | 21 ++++++++++ week07/NOTE.md | 20 +++++++++- 10 files changed, 465 insertions(+), 1 deletion(-) create mode 100644 week07/127.go create mode 100644 week07/130.go create mode 100644 week07/200.go create mode 100644 week07/208.go create mode 100644 week07/22.go create mode 100644 week07/36.go create mode 100644 week07/433.go create mode 100644 week07/547.go create mode 100644 week07/70.go diff --git a/week07/127.go b/week07/127.go new file mode 100644 index 00000000..00be4aed --- /dev/null +++ b/week07/127.go @@ -0,0 +1,73 @@ +package main + +//127 单词接龙 + +// 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则: + +// 每次转换只能改变一个字母。 +// 转换过程中的中间单词必须是字典中的单词。 + +// 输入: +// beginWord = "hit", +// endWord = "cog", +// wordList = ["hot","dot","dog","lot","log","cog"] + +// 输出: 5 + +// 解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", +// 返回它的长度 5。 +//单dfs会超时,其实也能理解因为从前到后要换26次 时间复杂度太高了 + +func ladderLength(beginWord string, endWord string, wordList []string) int { + dic := make(map[string]bool) + for _, v := range wordList { + dic[v] = true + } + + if dic[endWord] == false { + return 0 + } + + q1 := []string{beginWord} + q2 := []string{endWord} + step := 0 + + for len(q1) > 0 && len(q2) > 0 { + step++ + + if len(q1) > len(q2) { + q1, q2 = q2, q1 + } + + for _, w := range q1 { + q1 = q1[1:] + + for j := 0; j < len(w); j++ { + for k := 'a'; k <= 'z'; k++ { + tmp := w[:j] + string(k) + w[j+1:] + + if indexOf(q2, tmp) != -1 { + return step + 1 + } + + if dic[tmp] == false { + continue + } + delete(dic, tmp) + q1 = append(q1, tmp) + } + } + } + } + + return 0 +} + +func indexOf(slice []string, item string) int { + for i, _ := range slice { + if slice[i] == item { + return i + } + } + return -1 +} diff --git a/week07/130.go b/week07/130.go new file mode 100644 index 00000000..366e2ff0 --- /dev/null +++ b/week07/130.go @@ -0,0 +1,45 @@ +package main + +import "fmt" + +//被围绕的区域 dfs处理应该更快 这个跟岛屿数量问题应该是一样的意思 +func solve(board [][]byte) { + m := len(board) + if m == 0 { + return + } + n := len(board[0]) + for i := 0; i < m; i++ { + for j := 0; j < n; j++ { + if isEdge(i, j, m, n) && board[i][j] == 'O' { + dfs(i, j, board) + } + } + } + fmt.Println(board) + for i := 0; i < m; i++ { + for j := 0; j < n; j++ { + if board[i][j] == 'O' { + board[i][j] = 'X' + } + if board[i][j] == '#' { + board[i][j] = 'O' + } + } + } +} + +func isEdge(i, j, m, n int) bool { + return i == 0 || j == 0 || i == m-1 || j == n-1 +} + +func dfs(i, j int, board [][]byte) { + if i < 0 || j < 0 || i >= len(board)-1 || j >= len(board[0])-1 || board[i][j] == 'X' || board[i][j] == '#' { + return + } + board[i][j] = '#' + dfs(i-1, j, board) + dfs(i+1, j, board) + dfs(i, j-1, board) + dfs(i, j+1, board) +} diff --git a/week07/200.go b/week07/200.go new file mode 100644 index 00000000..71d5cde5 --- /dev/null +++ b/week07/200.go @@ -0,0 +1,104 @@ +package main + +//dfs或者bfs 四联通向量处理 + +//dfs +func numIslands(grid [][]byte) int { + count := 0 + m := len(grid) + n := len(grid[0]) + for i := 0; i < m; i++ { + for j := 0; j < n; j++ { + if grid[i][j] == '1' { + count++ + dfs(i, j, grid) + } + } + } + return count +} + +func dfs(i, j int, grid [][]byte) { + if i < 0 || j < 0 || i > len(grid) || j > len(grid[0]) || grid[i][j] == '0' { + return + } + grid[i][j] = '0' + dfs(i-1, j, grid) + dfs(i+1, j, grid) + dfs(i, j-1, grid) + dfs(i, j+1, grid) +} + +//并查集处理 +//直接copy前面的代码部分 +type gridUnion struct { + count int + parent []int +} + +//二维数组变一维 index=i*列+j +func constructorGrid(grid [][]byte) *gridUnion { + row := len(grid) + col := len(grid[0]) + count := row * col + u := &gridUnion{parent: make([]int, count)} + for i := 0; i < row; i++ { + for j := 0; j < col; j++ { + u.parent[i*col+j] = i*col + j + if grid[i][j] == '1' { + u.count++ + } + } + } + return u +} + +func (u *gridUnion) find(p int) int { + for p != u.parent[p] { + u.parent[p] = u.parent[u.parent[p]] + p = u.parent[p] + } + return p +} + +func (u *gridUnion) uniton(p, q int) { + rootQ := u.find(q) + rootP := u.find(p) + + if rootP == rootQ { + return + } + u.parent[rootQ] = rootP + u.count-- +} + +func getIndex(i, j, n int) int { + return i*n + j +} + +func numIslandsUnion(grid [][]byte) int { + row := len(grid) + col := len(grid[0]) + unionFind := constructorGrid(grid) + for i := 0; i < row; i++ { + for j := 0; j < col; j++ { + if grid[i][j] == '1' { + if i-1 >= 0 && grid[i-1][j] == '1' { + unionFind.uniton(i*col+j, (i-1)*col+j) + } + if i+1 < row && grid[i+1][j] == '1' { + unionFind.uniton(i*col+j, (i+1)*col+j) + } + if j-1 >= 0 && grid[i][j-1] == '1' { + unionFind.uniton(i*col+j, i*col+(j-1)) + } + if j+1 < col && grid[i][j+1] == '1' { + unionFind.uniton(i*col+j, i*col+(j+1)) + } + //充值为0 + grid[i][j] = '0' + } + } + } + return unionFind.count +} diff --git a/week07/208.go b/week07/208.go new file mode 100644 index 00000000..3d5ddd89 --- /dev/null +++ b/week07/208.go @@ -0,0 +1,46 @@ +package main + +//前缀树 记住模板就好~其他的灵活一点 + +type Trie struct { + isEnd bool + next [26]*Trie +} + +/** Initialize your data structure here. */ +func Constructor() Trie { + return Trie{} +} + +/** Inserts a word into the trie. */ +func (this *Trie) Insert(word string) { + for _, v := range word { + if this.next[v-'a'] == nil { + this.next[v-'a'] = new(Trie) + } + this = this.next[v-'a'] + } + this.isEnd = true +} + +/** Returns if the word is in the trie. */ +func (this *Trie) Search(word string) bool { + for _, v := range word { + if this.next[v-'a'] == nil { + return false + } + this = this.next[v-'a'] + } + return this.isEnd +} + +/** Returns if there is any word in the trie that starts with the given prefix. */ +func (this *Trie) StartsWith(prefix string) bool { + for _, v := range prefix { + if this.next[v-'a'] == nil { + return false + } + this = this.next[v-'a'] + } + return true +} diff --git a/week07/22.go b/week07/22.go new file mode 100644 index 00000000..25220140 --- /dev/null +++ b/week07/22.go @@ -0,0 +1,24 @@ +package main + +func generateParenthesis(n int) []string { + result := new([]string) + + dfs("", 2*n, n, n, result) + + return *result +} +func dfs(buf string, length, left, right int, result *[]string) { + //移除条件,当长度等于2*n的时候,代表当前已经添加完毕 + if len(buf) == length { + *result = append(*result, buf) + return + } + //任意时候都可以 + if left > 0 { + dfs(buf+"(", length, left-1, right, result) + } + + if left < right { + dfs(buf+")", length, left, right-1, result) + } +} diff --git a/week07/36.go b/week07/36.go new file mode 100644 index 00000000..7203e471 --- /dev/null +++ b/week07/36.go @@ -0,0 +1,37 @@ +package main + +//仅仅是判断是否有效 行列小方格 +func isValidSudoku(board [][]byte) bool { + for i := 0; i < 9; i++ { + mp1 := map[byte]bool{} + mp2 := map[byte]bool{} + mp3 := map[byte]bool{} + for j := 0; j < 9; j++ { + // row + if board[i][j] != '.' { + if mp1[board[i][j]] { + return false + } + mp1[board[i][j]] = true + } + // column + if board[j][i] != '.' { + if mp2[board[j][i]] { + return false + } + mp2[board[j][i]] = true + } + // part 这个有点难搞 + row := (i%3)*3 + j%3 + col := (i/3)*3 + j/3 + if board[row][col] != '.' { + if mp3[board[row][col]] { + return false + } + mp3[board[row][col]] = true + } + + } + } + return true +} diff --git a/week07/433.go b/week07/433.go new file mode 100644 index 00000000..7e1e0055 --- /dev/null +++ b/week07/433.go @@ -0,0 +1,44 @@ +package main + +import "fmt" + +//跟单词接龙是一个意思 用bfs +func minMutation(start string, end string, bank []string) int { + dic := make(map[string]bool) + for _, v := range bank { + dic[v] = true + } + if ok := dic[end]; !ok { + return -1 + } + + ds := []string{"A", "C", "G", "T"} + queue := []string{start} + step := 0 + for len(queue) > 0 { + size := len(queue) + for size > 0 { + word := queue[0] + queue = queue[1:] + for j := 0; j < len(word); j++ { + for k := 0; k < len(ds); k++ { + tmp := word[:j] + ds[k] + word[j+1:] + if _, ok := dic[tmp]; ok { + queue = append(queue, tmp) + delete(dic, tmp) + } + if tmp == end { + return step + } + } + } + size-- + step++ + } + + } + return -1 +} +func main() { + fmt.Println(minMutation("AACCGGTT", "AACCGGTA", []string{})) +} diff --git a/week07/547.go b/week07/547.go new file mode 100644 index 00000000..a8d0130e --- /dev/null +++ b/week07/547.go @@ -0,0 +1,52 @@ +package main + +//bfs 或者并查集 +//并查集 constructor(构造函数) find uniton(合并) + +//https://www.bilibili.com/video/BV13t411v7Fs?p=1 讲的很好 +type union struct { + count int + parent []int +} + +func constructor(n int) *union { + parent := make([]int, n) + for i := 0; i < n; i++ { + parent[i] = i + } + return &union{ + parent: parent, + count: n, + } +} + +func (u *union) find(p int) int { + for p != u.parent[p] { + u.parent[p] = u.parent[u.parent[p]] + p = u.parent[p] + } + return p +} + +func (u *union) uniton(p, q int) { + rootQ := u.find(q) + rootP := u.find(p) + + if rootP == rootQ { + return + } + u.parent[rootQ] = rootP + u.count-- +} + +func findCircleNum(M [][]int) int { + union := constructor(len(M)) + for i := 0; i < len(M); i++ { + for j := 0; j < i; j++ { + if M[i][j] == 1 { + union.uniton(i, j) + } + } + } + return union.count +} diff --git a/week07/70.go b/week07/70.go new file mode 100644 index 00000000..fbdf4caa --- /dev/null +++ b/week07/70.go @@ -0,0 +1,21 @@ +package main + +import "fmt" + +//dp 动态规划 +//状态转移方程 dp[i]=dp[i-1]+dp[i-2] +func climbStairs(n int) int { + if n <= 2 { + return n + } + dp := make([]int, n+1) + dp[0] = 1 + dp[1] = 1 + for i := 2; i <= n; i++ { + dp[i] = dp[i-1] + dp[i-2] + } + return dp[n] +} +func main() { + fmt.Println(climbStairs(3)) +} diff --git a/week07/NOTE.md b/week07/NOTE.md index 50de3041..183ec092 100644 --- a/week07/NOTE.md +++ b/week07/NOTE.md @@ -1 +1,19 @@ -学习笔记 \ No newline at end of file +红黑树跟avl + +avl的四种旋转 和平衡因子的计算 是与树的深度右关系的。-101 +左 +右 +左右 +右左 + + + +--- 做题总结 + +- dfs与bfs写得比以前要熟练了,但是依然不能一气呵成得把题目解答出来。主要失败原因是因为有一些边界值未考虑到,以及做题得遍数还是不够 + +---未做题目 + +单词搜索 II +N 皇后 +解数独 \ No newline at end of file From 7b36122da0b3b1daa0a5a9a333792a43962d84f9 Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 13 Dec 2020 09:43:28 +0800 Subject: [PATCH 13/17] add --- week08/146.go | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++ week08/NOTE.md | 4 ++- 2 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 week08/146.go diff --git a/week08/146.go b/week08/146.go new file mode 100644 index 00000000..abb47861 --- /dev/null +++ b/week08/146.go @@ -0,0 +1,89 @@ +package main + +//实现LRU + +type Node struct { + key int + value int + prev *Node + next *Node +} + +type LRUCache struct { + //记录链表的长度 + size int + //记录map的容量 + capacity int + cache map[int]*Node + head, tail *Node +} + +func Constructor(capacity int) LRUCache { + l := &LRUCache{ + size: 0, + capacity: capacity, + cache: map[int]*Node{}, + head: &Node{key: 0, value: 0}, + tail: &Node{key: 0, value: 0}, + } + l.head.next = l.tail + l.tail.next = l.head + return *l + +} + +func (this *LRUCache) Get(key int) int { + if value, ok := this.cache[key]; ok { + //需要移动当前指针到队头 + this.moveToHead(value) + return value.value + } + return -1 +} + +func (this *LRUCache) moveToHead(node *Node) { + this.removeNode(node) + this.addToHead(node) +} + +func (this *LRUCache) addToHead(node *Node) { + node.prev = this.head + node.next = this.head.next + this.head.next.prev = node + this.head.next = node +} + +func (this *LRUCache) removeNode(node *Node) { + node.prev.next = node.next + node.next.prev = node.prev +} + +func (this *LRUCache) Put(key int, v int) { + //存放节点 + //放在队列头 + //记录当前value + if value, ok := this.cache[key]; ok { + //已经存在就替换 + value.value = v + this.moveToHead(value) + this.size++ + if this.size > this.capacity { + //淘汰一个不长使用的 + node := this.removeTail() + //清理缓存 + delete(this.cache, node.key) + this.size-- + } + } else { + //不存在就创建节点 + node := &Node{key: key, value: v} + this.cache[key] = node + this.addToHead(node) + + } +} +func (this *LRUCache) removeTail() *Node { + node := this.tail.prev + this.removeNode(node) + return node +} diff --git a/week08/NOTE.md b/week08/NOTE.md index 50de3041..60b51a2e 100644 --- a/week08/NOTE.md +++ b/week08/NOTE.md @@ -1 +1,3 @@ -学习笔记 \ No newline at end of file +双向链表的操作 + +挺有趣的 \ No newline at end of file From e23578a9745bc227710d555b9dc8e62d85d0eb5f Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 13 Dec 2020 13:20:10 +0800 Subject: [PATCH 14/17] update --- week08/1122.go | 34 ++++++++++++++++++++++++++++++++++ week08/191.go | 11 +++++++++++ week08/231.go | 9 +++++++++ week08/242.go | 24 ++++++++++++++++++++++++ week08/56.go | 31 +++++++++++++++++++++++++++++++ 5 files changed, 109 insertions(+) create mode 100644 week08/1122.go create mode 100644 week08/191.go create mode 100644 week08/231.go create mode 100644 week08/242.go create mode 100644 week08/56.go diff --git a/week08/1122.go b/week08/1122.go new file mode 100644 index 00000000..463499d6 --- /dev/null +++ b/week08/1122.go @@ -0,0 +1,34 @@ +package main + +import "sort" + +//日常读不懂题目!!! +// arr2出现 但是arr1未出现元素,升序存放到元素后面 +//新开一块空间存放数据 +// 输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6] +// 输出:[2,2,2,1,4,3,3,9,6,7,19] +func relativeSortArray(arr1 []int, arr2 []int) []int { + m := make(map[int][]int) + for _, v := range arr2 { + m[v] = make([]int, 0) + } + var other []int + for _, v := range arr1 { + if l, ok := m[v]; ok { + l = append(l, v) + m[v] = l + } else { + other = append(other, v) + } + } + // 将不在arr2的元素存在另外一个数组中,对这个数组重新排序 + sort.Ints(other) + var res []int + for _, v := range arr2 { + res = append(res, m[v]...) + } + //添加到arr2中 + res = append(res, other...) + + return arr1 +} diff --git a/week08/191.go b/week08/191.go new file mode 100644 index 00000000..84a6efaf --- /dev/null +++ b/week08/191.go @@ -0,0 +1,11 @@ +package main + +//用位运算 +func hammingWeight(num uint32) int { + sum := 0 + for num > 0 { + num &= num - 1 + sum++ + } + return sum +} diff --git a/week08/231.go b/week08/231.go new file mode 100644 index 00000000..18c37117 --- /dev/null +++ b/week08/231.go @@ -0,0 +1,9 @@ +package main + +// 2的幂 +//给定一个整数,编写一个函数来判断它是否是 2 的幂次方。 +//二进制中只能存在1个 1 + +func isPowerOfTwo(n int) bool { + return n&(n-1) == 0 +} diff --git a/week08/242.go b/week08/242.go new file mode 100644 index 00000000..c48a7639 --- /dev/null +++ b/week08/242.go @@ -0,0 +1,24 @@ +package main + +// 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词 + +// 利用hashmap计数即可 +func isAnagram(s string, t string) bool { + mac := make(map[rune]int) + for _, value := range s { + mac[value]++ + } + for _, value := range t { + if temp, ok := mac[value]; ok { + temp = temp - 1 + if temp == 0 { + delete(mac, value) + } else { + mac[value] = temp + } + } else { + return false + } + } + return len(mac) == 0 +} diff --git a/week08/56.go b/week08/56.go new file mode 100644 index 00000000..12bcf9d8 --- /dev/null +++ b/week08/56.go @@ -0,0 +1,31 @@ +package main + +import "sort" + +//因为给定的每个小区间都是升序的,问题就变得很清楚了,首先排序元素, +//然后一次遍历区间的最大值关系,然后决定是否合并 +func merge(intervals [][]int) [][]int { + //排序 + sort.Slice(intervals, func(i, j int) bool { + return intervals[i][0] < intervals[j][0] + }) + res := [][]int{} + prev := intervals[0] + for i := 1; i < len(intervals); i++ { + cur := intervals[i] + if prev[1] < cur[0] { // 没有一点重合 + res = append(res, prev) + prev = cur + } else { // 有重合 + prev[1] = max(prev[1], cur[1]) + } + } + res = append(res, prev) + return res +} +func max(a, b int) int { + if a > b { + return a + } + return b +} From 3e10bd4ffdac6e3ed0691f2357b449bb98af7727 Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 20 Dec 2020 19:03:15 +0800 Subject: [PATCH 15/17] update --- week09/115.go | 18 ++++++++ week09/121.go | 32 +++++++++++++ week09/198.go | 21 +++++++++ week09/300.go | 27 +++++++++++ week09/32.go | 34 ++++++++++++++ week09/62.go | 30 ++++++++++++ week09/63.go | 31 +++++++++++++ week09/64.go | 35 ++++++++++++++ week09/70.go | 27 +++++++++++ week09/818.go | 1 + week09/85.go | 13 ++++++ week09/91.go | 46 +++++++++++++++++++ week09/NOTE.md | 10 +++- .../387.go" | 18 ++++++++ .../541.go" | 5 ++ 15 files changed, 347 insertions(+), 1 deletion(-) create mode 100644 week09/115.go create mode 100644 week09/121.go create mode 100644 week09/198.go create mode 100644 week09/300.go create mode 100644 week09/32.go create mode 100644 week09/62.go create mode 100644 week09/63.go create mode 100644 week09/64.go create mode 100644 week09/70.go create mode 100644 week09/818.go create mode 100644 week09/85.go create mode 100644 week09/91.go create mode 100644 "week09/\345\255\227\347\254\246\344\270\262/387.go" create mode 100644 "week09/\345\255\227\347\254\246\344\270\262/541.go" diff --git a/week09/115.go b/week09/115.go new file mode 100644 index 00000000..1517043e --- /dev/null +++ b/week09/115.go @@ -0,0 +1,18 @@ +package main + +func numDistinct(s string, t string) int { + dp := [1001][1001]int{} + sl, tl := len(s), len(t) + dp[tl][sl] = 1 + for ti := tl; ti >= 0; ti-- { + for si := sl - 1; si >= 0; si-- { + dp[ti][si] = dp[ti][si+1] + if ti == tl { + dp[ti][si] = 1 + } else if t[ti] == s[si] { + dp[ti][si] += dp[ti+1][si+1] + } + } + } + return dp[0][0] +} diff --git a/week09/121.go b/week09/121.go new file mode 100644 index 00000000..baa374b6 --- /dev/null +++ b/week09/121.go @@ -0,0 +1,32 @@ +package main + +import "fmt" + +//转移方程 + +//dp[i][0] 没有 max(dp[i-1][0],dp[i-1][1]+prices[i]) 不动 卖出 +//dp[i][1] 持有 max(dp[i-1][1],dp[i-1][0]-prices[i]) 不动 买进 +func maxProfit(prices []int) int { + if len(prices) == 0 { + return 0 + } + dp := make([][2]int, len(prices)) + for i := 0; i < len(prices); i++ { + if i == 0 { + dp[i][0] = 0 + dp[i][1] = 0 - prices[i] + continue + } + dp[i][0] = max(dp[i-1][0], dp[i-1][1]+prices[i]) + dp[i][1] = max(dp[i-1][1], -prices[i]) + } + fmt.Println(dp) + return dp[len(prices)-1][0] +} + +func max(x, y int) int { + if x < y { + return y + } + return x +} diff --git a/week09/198.go b/week09/198.go new file mode 100644 index 00000000..ffa41b4c --- /dev/null +++ b/week09/198.go @@ -0,0 +1,21 @@ +package main + +//状态转移方程 + +//dp[i]=max(dp[i-2]+nums[i],dp[i-1]) +func rob(nums []int) int { + if len(nums) == 0 { + return 0 + } + if len(nums) == 1 { + return nums[0] + } + dp := make([]int, len(nums)) + dp[0] = nums[0] + dp[1] = max(nums[0], nums[1]) + + for i := 2; i < len(nums); i++ { + dp[i] = max(dp[i-2]+nums[i], dp[i-1]) + } + return dp[len(nums)-1] +} diff --git a/week09/300.go b/week09/300.go new file mode 100644 index 00000000..9242c96c --- /dev/null +++ b/week09/300.go @@ -0,0 +1,27 @@ +package main + +//状态转移方程dp代表长度 +// dp[i]=max(dp[j]+1,dp[i]) + +//n平方的时间复杂度 +func lengthOfLIS(nums []int) int { + if len(nums) == 0 { + return 0 + } + var res int + //初始化 + dp := make([]int, len(nums)) + for i := 0; i < len(nums); i++ { + dp[i] = 1 + } + //处理 + for i := 0; i < len(nums); i++ { + for j := 0; j < i; j++ { + if nums[i] > nums[j] { + dp[i] = max(dp[i], dp[j]+1) + } + } + res = max(res, dp[i]) + } + return res +} diff --git a/week09/32.go b/week09/32.go new file mode 100644 index 00000000..e7b76060 --- /dev/null +++ b/week09/32.go @@ -0,0 +1,34 @@ +package main + +// 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度。 + +//状态转移方程 dp代表数量 + +//s[i]等于右括号的时候 ....) 这时候只需要找前面一个是否属于左括号 或者前面的前面是否已经有左括号 +//紧挨着的左括号 dp[i]=dp[i-1]+2 +//挨着的不是左括号,那就继续往前找 + +//使用栈是最合适的求解,但是在这里顺便练习一下动态规划 +func longestValidParentheses(s string) int { + dp := make([]int, len(s)) + maxAns := 0 + for i := 1; i < len(s); i++ { + if s[i] == ')' { + if s[i]-1 == '(' { + if i >= 2 { + dp[i] = dp[i-2] + 2 + } else { + dp[i] = 2 + } + } else if i-dp[i-1] > 0 && s[i-dp[i-1]-1] == '(' { + if i-dp[i-1] >= 2 { + dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2 + } else { + dp[i] = dp[i-1] + 2 + } + } + maxAns = max(maxAns, dp[i]) + } + } + return maxAns +} diff --git a/week09/62.go b/week09/62.go new file mode 100644 index 00000000..5a17045f --- /dev/null +++ b/week09/62.go @@ -0,0 +1,30 @@ +package main + +import "fmt" + +// 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 + +// 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 + +//dp方程 +//dp[i][j]=dp[i-1][j]+dp[i][j-1] +func uniquePaths(m int, n int) int { + dp := make([][]int, m) + //需要先初始化 + for i := 0; i < m; i++ { + dp[i] = make([]int, n) + } + for i := 0; i < m; i++ { + dp[i][0] = 1 + } + for i := 0; i < n; i++ { + dp[0][i] = 1 + } + fmt.Println(dp) + for i := 1; i < m; i++ { + for j := 1; j < n; j++ { + dp[i][j] = dp[i-1][j] + dp[i][j-1] + } + } + return dp[m-1][n-1] +} diff --git a/week09/63.go b/week09/63.go new file mode 100644 index 00000000..92842004 --- /dev/null +++ b/week09/63.go @@ -0,0 +1,31 @@ +package main + +//dp[i][j]=dp[i-1][j]+dp[i][j-1] +func uniquePathsWithObstacles(obstacleGrid [][]int) int { + m := len(obstacleGrid) + n := len(obstacleGrid[0]) + if m > 0 && n > 0 && obstacleGrid[0][0] == 1 { + return 0 + } + + for i := 0; i < m; i++ { + for j := 0; j < n; j++ { + if i == 0 && j == 0 { + obstacleGrid[i][j] = 1 + continue + } + if obstacleGrid[i][j] == 1 { + obstacleGrid[i][j] = 0 + } else { + if i == 0 { + obstacleGrid[i][j] = obstacleGrid[i][j-1] + } else if j == 0 { + obstacleGrid[i][j] = obstacleGrid[i-1][j] + } else { + obstacleGrid[i][j] = obstacleGrid[i-1][j] + obstacleGrid[i][j-1] + } + } + } + } + return obstacleGrid[m-1][n-1] +} diff --git a/week09/64.go b/week09/64.go new file mode 100644 index 00000000..adc2f57f --- /dev/null +++ b/week09/64.go @@ -0,0 +1,35 @@ +package main + +// 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 + +// 说明:每次只能向下或者向右移动一步。 + +//状态转移方程 +//dp[i][j]=dp[i][j]+min(dp[i-1][j],dp[i][j-1]) + +//边界值要注意下i:=0;i +func minPathSum(grid [][]int) int { + m := len(grid) + n := len(grid[0]) + for i := 0; i < len(grid); i++ { + for j := 0; j < len(grid[i]); j++ { + if i == 0 && j == 0 { + continue + } else if i == 0 { + grid[i][j] = grid[i][j] + grid[i][j-1] + } else if j == 0 { + grid[i][j] = grid[i-1][j] + grid[i][j-1] + } else { + grid[i][j] = grid[i][j] + min(grid[i-1][j], grid[i][j-1]) + } + } + } + return grid[m-1][n-1] +} + +func min(x, y int) int { + if x < y { + return x + } + return y +} diff --git a/week09/70.go b/week09/70.go new file mode 100644 index 00000000..769d4062 --- /dev/null +++ b/week09/70.go @@ -0,0 +1,27 @@ +package main + +//爬楼梯问题 + +//1 2 3 ...可以爬1 2 3阶 +//只能从m[] 数组给的选择 +//爬楼梯的中间不能相等 + +// 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 + +// 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? + +// 注意:给定 n 是一个正整数。 +func climbStairs(n int) int { + var dp []int + dp[0] = 1 + dp[1] = 2 + for i := 2; i <= n; i++ { + dp[i] = dp[i-1] + dp[i-2] + } + return dp[n] +} + +//可以爬 1 2 3 +//dp[i] = dp[i-1] + dp[i-2]+dp[i-3] + +//需要数组的情况下 diff --git a/week09/818.go b/week09/818.go new file mode 100644 index 00000000..7d7cbd6a --- /dev/null +++ b/week09/818.go @@ -0,0 +1 @@ +// 818. 赛车 diff --git a/week09/85.go b/week09/85.go new file mode 100644 index 00000000..3757b090 --- /dev/null +++ b/week09/85.go @@ -0,0 +1,13 @@ +package main + +func maximalRectangle(matrix [][]byte) int { + for i := 0; i > len(matrix); i++ { + for j := 0; j < len(matrix[i]); j++ { + if matrix[i][j] == 1 { + + } + + } + } + +} diff --git a/week09/91.go b/week09/91.go new file mode 100644 index 00000000..87b9cd38 --- /dev/null +++ b/week09/91.go @@ -0,0 +1,46 @@ +package main + +import "fmt" + +// 一条包含字母 A-Z 的消息通过以下方式进行了编码: + +// 'A' -> 1 +// 'B' -> 2 +// ... +// 'Z' -> 26 +// 给定一个只包含数字的非空字符串,请计算解码方法的总数。 + +// 题目数据保证答案肯定是一个 32 位的整数。 +//状态转移方程 +//数量 dp +//当前等于0的时候,前缀一定是1或者2 + +// 处理 最开始比较特别所以一定要注意边界值 i>2=2 dp[i]=dp[i-2] dp[i]=1 +//不等于0 dp[i]=dp[i]+dp[i-1] +func numDecodings(s string) int { + if s == "0" { + return 0 + } + if s[0] == '0' { + return 0 + } + dp := make([]int, len(s)) + dp[0] = 1 + for i := 1; i < len(s); i++ { + if s[i-1] == '1' || s[i-1] == '2' && s[i] >= '0' && s[i] <= '6' { + if i >= 2 { + dp[i] = dp[i-2] + } else { + dp[i] = 1 + } + } + if s[i] != '0' { + dp[i] += dp[i-1] + } + } + fmt.Println(dp) + return dp[len(s)-1] +} +func main() { + numDecodings("12") +} diff --git a/week09/NOTE.md b/week09/NOTE.md index 50de3041..0f78c249 100644 --- a/week09/NOTE.md +++ b/week09/NOTE.md @@ -1 +1,9 @@ -学习笔记 \ No newline at end of file + + + +不足点 + +dp 不足 + + +现在能解部分的题目,但是所有东西列出来,寻找状态转移方程的时候,还是在没办法最快找到 \ No newline at end of file diff --git "a/week09/\345\255\227\347\254\246\344\270\262/387.go" "b/week09/\345\255\227\347\254\246\344\270\262/387.go" new file mode 100644 index 00000000..f15fdaa1 --- /dev/null +++ "b/week09/\345\255\227\347\254\246\344\270\262/387.go" @@ -0,0 +1,18 @@ +package main + +//利用hash +//或者利用数组 +func firstUniqChar(s string) int { + var arr [26]int + for i, k := range s { + arr[k-'a'] = i + } + for i, k := range s { + if i == arr[k-'a'] { + return i + } else { + arr[k-'a'] = -1 + } + } + return -1 +} diff --git "a/week09/\345\255\227\347\254\246\344\270\262/541.go" "b/week09/\345\255\227\347\254\246\344\270\262/541.go" new file mode 100644 index 00000000..a942a2c2 --- /dev/null +++ "b/week09/\345\255\227\347\254\246\344\270\262/541.go" @@ -0,0 +1,5 @@ +package main + +func reverseStr(s string, k int) string { + +} From 32309ffaf88b7863a12fae8789a0564142ebe178 Mon Sep 17 00:00:00 2001 From: carl-Xiao <270555686@qq.com> Date: Mon, 4 Jan 2021 08:58:11 +0800 Subject: [PATCH 16/17] update --- week10/NOTE.md | 1 - "week10/\346\200\273\347\273\223.md" | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) delete mode 100644 week10/NOTE.md create mode 100644 "week10/\346\200\273\347\273\223.md" diff --git a/week10/NOTE.md b/week10/NOTE.md deleted file mode 100644 index 50de3041..00000000 --- a/week10/NOTE.md +++ /dev/null @@ -1 +0,0 @@ -学习笔记 \ No newline at end of file diff --git "a/week10/\346\200\273\347\273\223.md" "b/week10/\346\200\273\347\273\223.md" new file mode 100644 index 00000000..99b7f9bc --- /dev/null +++ "b/week10/\346\200\273\347\273\223.md" @@ -0,0 +1,6 @@ +总体对早已经遗忘的数据结构和算法过了一遍,在群里看到了很多上进的人。 +有天赋的人往往比你更努力。 + +成长 + +眼界拓宽了,看到了更多的算法理解。 From 04d5d54b8fd006eca4144f9126ac683988f2e04c Mon Sep 17 00:00:00 2001 From: Carl-Xiao <270555686@qq.com> Date: Sun, 10 Jan 2021 10:55:16 +0800 Subject: [PATCH 17/17] update --- .../541.go" | 168 +++++++++++++++++- 1 file changed, 167 insertions(+), 1 deletion(-) diff --git "a/week09/\345\255\227\347\254\246\344\270\262/541.go" "b/week09/\345\255\227\347\254\246\344\270\262/541.go" index a942a2c2..4ff7352d 100644 --- "a/week09/\345\255\227\347\254\246\344\270\262/541.go" +++ "b/week09/\345\255\227\347\254\246\344\270\262/541.go" @@ -1,5 +1,171 @@ package main -func reverseStr(s string, k int) string { +import ( + "fmt" + "strconv" +) +// 输入: +// beginWord = "hit", +// endWord = "cog", +// wordList = ["hot","dot","dog","lot","log","cog"] + +// 输出: 5 + +// 解释: 一个最短转换序列是 "hit" -> "hot" -> "dot" -> "dog" -> "cog", +// 返回它的长度 5。 + +//bfs +func ladderLength(beginWord string, endWord string, wordList []string) int { + mac := map[string]int{} + for _, value := range wordList { + mac[value] = 1 + } + if mac[endWord] == 0 { + return 0 + } + var front []string + var end []string + front = append(front, beginWord) + end = append(end, endWord) + count := 0 + for len(front) > 0 && len(end) > 0 { + count++ + if len(front) > len(end) { + front, end = end, front + } + for _, word := range front { + front = front[1:] + for index := range word { + for c := 'a'; c <= 'z'; c++ { + newWord := word[:index] + string(c) + word[index+1:] + if contains(newWord, end) { + fmt.Println(newWord, end) + return count + 1 + } + if mac[newWord] == 0 { + continue + } + delete(mac, newWord) + front = append(front, newWord) + } + } + } + } + return 0 +} + +func contains(key string, result []string) bool { + for _, value := range result { + if value == key { + return true + } + } + return false +} + +type TreeNode struct { + Val int + Left *TreeNode + Right *TreeNode +} + +func rightSideView(root *TreeNode) []int { + result := new([]int) + if root == nil { + return *result + } + dfsVies(root, result, 0) + return *result +} + +func dfsVies(root *TreeNode, result *[]int, depth int) { + if root == nil { + return + } + if depth == len(*result) { + *result = append(*result, root.Val) + } + depth++ + //注意当前顺序问题====》为解决退化成链表的形式 + dfsVies(root.Right, result, depth) + + dfsVies(root.Left, result, depth) +} + +var ( + width map[int]int + ans int +) + +func widthOfBinaryTree(root *TreeNode) int { + ans = 0 + width = map[int]int{} + dfsWidth(root, 0, 0) + return ans +} + +func dfsWidth(root *TreeNode, depth, pos int) { + if root == nil { + return + } + if _, ok := width[depth]; !ok { + width[depth] = pos + } + //每一层的宽度 + ans = max(ans, pos-width[depth]+1) + dfsWidth(root.Left, depth+1, 2*pos) + dfsWidth(root.Right, depth+1, 2*pos+1) +} + +func max(x, y int) int { + if x < y { + return y + } + return x +} + +// 给定一个无重复元素的有序整数数组 nums 。 + +// 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。 + +// 列表中的每个区间范围 [a,b] 应该按如下格式输出: + +// "a->b" ,如果 a != b +// "a" ,如果 a == b + +// 输入:nums = [0,1,2,4,5,7] +// 输出:["0->2","4->5","7"] +// 解释:区间范围是: +// [0,2] --> "0->2" +// [4,5] --> "4->5" +// [7,7] --> "7" + +func summaryRanges(nums []int) []string { + var sb []string + var i int + for j := 0; j < len(nums); j++ { + if j+1 == len(nums) || nums[j]+1 != nums[j+1] { + var s string + s = s + strconv.Itoa(nums[i]) + if i != j { + s = s + "->" + strconv.Itoa(nums[j]) + } + sb = append(sb, s) + i = j + 1 + } + } + return sb +} + +func main() { + root := &TreeNode{ + Val: 1, + } + left := &TreeNode{ + Val: 2, + } + root.Left = left + + fmt.Println(rightSideView(root)) }