From a5af07cf47eea6d4b1dd26290fe14f742adf843c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=BF=81?= Date: Sun, 15 Mar 2020 17:06:09 +0800 Subject: [PATCH 1/4] G20200343040334-Week 01 --- .gitignore | 2 + Week_01/G20200343040334/project/one/main.go | 84 +++++++++++++++++++++ Week_01/G20200343040334/project/two/main.go | 70 +++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 .gitignore create mode 100644 Week_01/G20200343040334/project/one/main.go create mode 100644 Week_01/G20200343040334/project/two/main.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..a505ae07 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.swp +.idea diff --git a/Week_01/G20200343040334/project/one/main.go b/Week_01/G20200343040334/project/one/main.go new file mode 100644 index 00000000..d2baabf6 --- /dev/null +++ b/Week_01/G20200343040334/project/one/main.go @@ -0,0 +1,84 @@ +package main + +import "fmt" + +// https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ +// 26. 删除排序数组中的重复项 +//给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 +// +// 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 +// +// +// +// 示例 1: +// +// 给定数组 nums = [1,1,2], +// +//函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 +// +//你不需要考虑数组中超出新长度后面的元素。 +// +// 示例 2: +// +// 给定 nums = [0,0,1,1,1,2,2,3,3,4], +// +//函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 +// +//你不需要考虑数组中超出新长度后面的元素。 +// +// +// +// +// 说明: +// +// 为什么返回数值是整数,但输出的答案是数组呢? +// +// 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 +// +// 你可以想象内部操作如下: +// +// // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 +//int len = removeDuplicates(nums); +// +//// 在函数里修改输入数组对于调用者是可见的。 +//// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。 +//for (int i = 0; i < len; i++) { +//    print(nums[i]); +//} +// +// Related Topics 数组 双指针 + + +func main() { + nums := []int{1,3,34,34,45,45,45} + removeDuplicates(nums) + removeDuplicates2(nums) +} + +/** + left right指针作比较,将相等的移到右侧 + */ +func removeDuplicates(nums []int) int { + left, right := 0, 1 + for ; right < len(nums); right++ { + if nums[left] == nums[right] { + continue + } + left ++ + nums[left] = nums[right] + } + return left+1 +} + +/** + 数组覆盖值 + */ +func removeDuplicates2(nums []int) int { + for i:=len(nums)-1; i>0; i-- { + if nums[i] == nums[i-1] { + nums = append(nums[:i], nums[i+1:]...) + fmt.Println(nums) + } + } + return len(nums) +} diff --git a/Week_01/G20200343040334/project/two/main.go b/Week_01/G20200343040334/project/two/main.go new file mode 100644 index 00000000..4455955e --- /dev/null +++ b/Week_01/G20200343040334/project/two/main.go @@ -0,0 +1,70 @@ +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] +// +// +// 示例 2: +// +// 输入: [-1,-100,3,99] 和 k = 2 +//输出: [3,99,-1,-100] +//解释: +//向右旋转 1 步: [99,-1,-100,3] +//向右旋转 2 步: [3,99,-1,-100] +// +// 说明: +// +// +// 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 +// 要求使用空间复杂度为 O(1) 的 原地 算法。 +// +// Related Topics 数组 + + +//leetcode submit region begin(Prohibit modification and deletion) +/** + 语法特性, + */ +func rotate(nums []int, k int) { + k %= len(nums) + nums = append(nums[len(nums)-k:], nums[:len(nums)-k]...) + fmt.Println(nums) +} + +/** + 三层反转,前部分、后部分、全部 + */ +func rotate2(nums []int, k int) { + k %= len(nums) + reverse(nums[:len(nums)-k]) + reverse(nums[len(nums)-k:]) + reverse(nums) + fmt.Println(nums) +} + +func reverse(nums []int) { + i,j := 0,len(nums)-1 + for i < j{ + nums[i], nums[j] = nums[j], nums[i] + i++ + j-- + } +} +//leetcode submit region end(Prohibit modification and deletion) + +func main() { + nums := []int{1,2,3,4,5,6,7} + rotate(nums, 5) + nums = []int{1,2,3,4,5,6,7} + rotate2(nums, 5) +} From 867cf37fa2552873db5418065864cc12a27cd02e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=BF=81?= Date: Sun, 15 Mar 2020 22:25:00 +0800 Subject: [PATCH 2/4] 0334_Week01(go) --- Week_01/G20200343040334/project/one/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Week_01/G20200343040334/project/one/main.go b/Week_01/G20200343040334/project/one/main.go index d2baabf6..7155df02 100644 --- a/Week_01/G20200343040334/project/one/main.go +++ b/Week_01/G20200343040334/project/one/main.go @@ -56,7 +56,7 @@ func main() { } /** - left right指针作比较,将相等的移到右侧 + left right指针作比较,将相等的移到右侧 d */ func removeDuplicates(nums []int) int { left, right := 0, 1 From 887977f5fe26e74b44e4f25710865c026783985d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=BF=81?= Date: Sun, 22 Mar 2020 21:47:02 +0800 Subject: [PATCH 3/4] 0334_Week02 (Go) --- Week_02/G20200343040334/NOTE.md | 13 +++- .../main.go" | 38 +++++++++ .../note.md" | 19 +++++ ...11\346\225\260\344\271\213\345\222\214.md" | 16 ++++ .../main.go" | 62 +++++++++++++++ ...10\347\232\204\346\213\254\345\217\267.md" | 30 +++++++ .../main.go" | 30 +++++++ ...15\345\274\202\344\275\215\350\257\215.md" | 26 +++++++ .../main.go" | 78 +++++++++++++++++++ .../main.go" | 33 ++++++++ .../main.go" | 51 ++++++++++++ .../note.md" | 26 +++++++ ...47\347\232\204\347\237\251\345\275\242.md" | 24 ++++++ .../main.go" | 50 ++++++++++++ .../main.go" | 48 ++++++++++++ 15 files changed, 543 insertions(+), 1 deletion(-) create mode 100644 "Week_02/G20200343040334/project/test/1.\344\270\244\346\225\260\344\271\213\345\222\214/main.go" create mode 100644 "Week_02/G20200343040334/project/test/1.\344\270\244\346\225\260\344\271\213\345\222\214/note.md" create mode 100644 "Week_02/G20200343040334/project/test/15.\344\270\211\346\225\260\344\271\213\345\222\214/15. \344\270\211\346\225\260\344\271\213\345\222\214.md" create mode 100644 "Week_02/G20200343040334/project/test/15.\344\270\211\346\225\260\344\271\213\345\222\214/main.go" create mode 100644 "Week_02/G20200343040334/project/test/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" create mode 100644 "Week_02/G20200343040334/project/test/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/main.go" create mode 100644 "Week_02/G20200343040334/project/test/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" create mode 100644 "Week_02/G20200343040334/project/test/242.\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" create mode 100644 "Week_02/G20200343040334/project/test/365.\346\260\264\345\243\266\351\227\256\351\242\230/main.go" create mode 100644 "Week_02/G20200343040334/project/test/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/main.go" create mode 100644 "Week_02/G20200343040334/project/test/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/note.md" create mode 100644 "Week_02/G20200343040334/project/test/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" create mode 100644 "Week_02/G20200343040334/project/test/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/main.go" create mode 100644 "Week_02/G20200343040334/project/test/945.\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217/main.go" diff --git a/Week_02/G20200343040334/NOTE.md b/Week_02/G20200343040334/NOTE.md index 50de3041..e978e83f 100644 --- a/Week_02/G20200343040334/NOTE.md +++ b/Week_02/G20200343040334/NOTE.md @@ -1 +1,12 @@ -学习笔记 \ No newline at end of file +### 学习笔记 +#### 栈 +`栈是一种特殊的线性表,具有和线性表的特点,同时也有特殊性:元素遵循“先进后出”的特点,也就是只能从栈顶插入或删除元素。同样可以用顺序存储和链式存储两种方式实现,分别称为顺序栈和链栈。栈结构可以用来实现表达式求值、括号匹配等。 + 栈的特点可以看成是一个桶,往桶里面装东西,取东西都是从上面进行的,最先放进去的要最后才能取出来` + +#### 队列 +`队列也是一种特殊的线性表,它的特殊性在于“先进先出”,如同现实生活中的排队问题:先来的人先服务完先走。不同于栈的地方在于队列一端用来插入新元素,一端用来删除元素,即有队首和队尾` + + + +#### hash +`hash碰撞解决方式,拉链法 与开放定址法相比,拉链法有如下几个优点: ①拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短; ②由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况; ③开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间; ④在用拉链法构造的散列表中,删除结点的操作易于实现。只要简单地删去链表上相应的结点即可。而对开放地址法构造的散列表,删除结点不能简单地将被删结 点的空间置为空,否则将截断在它之后填人散列表的同义词结点的查找路径。这是因为各种开放地址法中,空地址单元(即开放地址)都是查找失败的条件。因此在 用开放地址法处理冲突的散列表上执行删除操作,只能在被删结点上做删除标记,而不能真正删除结点。 (3)拉链法的缺点  拉链法的缺点是:指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。` \ No newline at end of file diff --git "a/Week_02/G20200343040334/project/test/1.\344\270\244\346\225\260\344\271\213\345\222\214/main.go" "b/Week_02/G20200343040334/project/test/1.\344\270\244\346\225\260\344\271\213\345\222\214/main.go" new file mode 100644 index 00000000..5136ab4f --- /dev/null +++ "b/Week_02/G20200343040334/project/test/1.\344\270\244\346\225\260\344\271\213\345\222\214/main.go" @@ -0,0 +1,38 @@ +package main + +import "fmt" + +/** +//给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 +// +// 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 +// +// 示例: +// +// 给定 nums = [2, 7, 11, 15], target = 9 +// +//因为 nums[0] + nums[1] = 2 + 7 = 9 +//所以返回 [0, 1] +// +// Related Topics 数组 哈希表 + + +*/ +func main() { + fmt.Println(twoSum([]int{2, 7, 11, 15}, 9)) +} + +func twoSum(nums []int, target int) []int { + var result []int + maps := map[int]int{} + for index, num := range nums { + if _, ok := maps[target - num]; ok{ + result = append(result, index, maps[target - num]) + return result + } + maps[num] = index + } + return result +} + + diff --git "a/Week_02/G20200343040334/project/test/1.\344\270\244\346\225\260\344\271\213\345\222\214/note.md" "b/Week_02/G20200343040334/project/test/1.\344\270\244\346\225\260\344\271\213\345\222\214/note.md" new file mode 100644 index 00000000..db076612 --- /dev/null +++ "b/Week_02/G20200343040334/project/test/1.\344\270\244\346\225\260\344\271\213\345\222\214/note.md" @@ -0,0 +1,19 @@ +//给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。 +// +// 你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 +// +// 示例: +// +// 给定 nums = [2, 7, 11, 15], target = 9 +// +//因为 nums[0] + nums[1] = 2 + 7 = 9 +//所以返回 [0, 1] +// +// Related Topics 数组 哈希表 + + +//leetcode submit region begin(Prohibit modification and deletion) +func twoSum(nums []int, target int) []int { + +} +//leetcode submit region end(Prohibit modification and deletion) diff --git "a/Week_02/G20200343040334/project/test/15.\344\270\211\346\225\260\344\271\213\345\222\214/15. \344\270\211\346\225\260\344\271\213\345\222\214.md" "b/Week_02/G20200343040334/project/test/15.\344\270\211\346\225\260\344\271\213\345\222\214/15. \344\270\211\346\225\260\344\271\213\345\222\214.md" new file mode 100644 index 00000000..dcb14971 --- /dev/null +++ "b/Week_02/G20200343040334/project/test/15.\344\270\211\346\225\260\344\271\213\345\222\214/15. \344\270\211\346\225\260\344\271\213\345\222\214.md" @@ -0,0 +1,16 @@ +15. 三数之和 +给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。 + +注意:答案中不可以包含重复的三元组。 + + + +示例: + +给定数组 nums = [-1, 0, 1, 2, -1, -4], + +满足要求的三元组集合为: +[ + [-1, 0, 1], + [-1, -1, 2] +] \ No newline at end of file diff --git "a/Week_02/G20200343040334/project/test/15.\344\270\211\346\225\260\344\271\213\345\222\214/main.go" "b/Week_02/G20200343040334/project/test/15.\344\270\211\346\225\260\344\271\213\345\222\214/main.go" new file mode 100644 index 00000000..96a890a9 --- /dev/null +++ "b/Week_02/G20200343040334/project/test/15.\344\270\211\346\225\260\344\271\213\345\222\214/main.go" @@ -0,0 +1,62 @@ +package main + +import "fmt" + +func main() { + fmt.Println(threeSum([]int{-1, 0, 1, 2, -1, -4})) +} + +func threeSum(nums []int) [][]int { + if len(nums) < 3 { return [][]int{} } + + QuickSort(nums) // 快排 O(n log n), 本地修改 + + ret := make([][]int, 0, 0) + for i := 0; i < len(nums) - 1; i++ { + l, r := i + 1, len(nums) - 1 + + if nums[i] > 0 || nums[i] + nums[l] > 0 { break } // 优化掉不可能的情况 + + if i > 0 && nums[i] == nums[i-1] { continue } // i 去重 + + for l < r { + if l > i + 1 && nums[l] == nums[l-1] { // l 去重 + l++; continue + } + if r < len(nums) - 2 && nums[r] == nums[r+1] { // r 去重 + r--; continue + } + + if nums[i] + nums[l] + nums[r] > 0 { // + r-- + } else if nums[i] + nums[l] + nums[r] < 0 { + l++ + } else { + ret = append(ret, []int{nums[i], nums[l], nums[r]}) + l++; r-- + } + } + } + + return ret +} + +func QuickSort(array []int) { + if len(array) < 2 { return } + + pivot := array[0] + l, r := 0, len(array) - 1 + + for i := 1; i <= r; { + if array[i] < pivot { // + array[l], array[i] = array[i], array[l] + l++; i++ + } else { + array[r], array[i] = array[i], array[r] + r-- + } + } + + QuickSort(array[:l]) + QuickSort(array[l + 1:]) +} diff --git "a/Week_02/G20200343040334/project/test/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" "b/Week_02/G20200343040334/project/test/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" new file mode 100644 index 00000000..991835fe --- /dev/null +++ "b/Week_02/G20200343040334/project/test/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267.md" @@ -0,0 +1,30 @@ +20. 有效的括号 + +给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。 + +有效字符串需满足: + +左括号必须用相同类型的右括号闭合。 +左括号必须以正确的顺序闭合。 +注意空字符串可被认为是有效字符串。 + +示例 1: + +输入: "()" +输出: true +示例 2: + +输入: "()[]{}" +输出: true +示例 3: + +输入: "(]" +输出: false +示例 4: + +输入: "([)]" +输出: false +示例 5: + +输入: "{[]}" +输出: true \ No newline at end of file diff --git "a/Week_02/G20200343040334/project/test/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/main.go" "b/Week_02/G20200343040334/project/test/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/main.go" new file mode 100644 index 00000000..b6f3ccd9 --- /dev/null +++ "b/Week_02/G20200343040334/project/test/20. \346\234\211\346\225\210\347\232\204\346\213\254\345\217\267/main.go" @@ -0,0 +1,30 @@ +package main + +import "fmt" + +func main() { + //s:= "({((())))" + s:= "(((())))" + isValid := isValid(s) + fmt.Println(isValid) +} +// 解题思路: +// 定义map dict := map[byte]byte{'(':')','{':'}','[':']'} +// 定义stack数组 +// 循环遍历 +// if stack为空则判断最后的元素和当前字符在map中是否存在 如果存在则出栈,不存在则继续入栈 +func isValid(s string) bool { + dict := map[byte]byte{'(':')','{':'}','[':']'} + var stack []byte + for _,v := range s{ + if len(stack) > 0{ + if byte(v) == dict[stack[len(stack)-1]]{ + stack = stack[:len(stack)-1] + continue + } + } + stack = append(stack, byte(v)) + fmt.Println(stack) + } + return len(stack)<1 +} diff --git "a/Week_02/G20200343040334/project/test/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" "b/Week_02/G20200343040334/project/test/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" new file mode 100644 index 00000000..35e75ffd --- /dev/null +++ "b/Week_02/G20200343040334/project/test/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215/242.\346\234\211\346\225\210\347\232\204\345\255\227\346\257\215\345\274\202\344\275\215\350\257\215.md" @@ -0,0 +1,26 @@ +//给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 +// +// 示例 1: +// +// 输入: s = "anagram", t = "nagaram" +//输出: true +// +// +// 示例 2: +// +// 输入: s = "rat", t = "car" +//输出: false +// +// 说明: +//你可以假设字符串只包含小写字母。 +// +// 进阶: +//如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? +// Related Topics 排序 哈希表 + + +//leetcode submit region begin(Prohibit modification and deletion) +func isAnagram(s string, t string) bool { + +} +//leetcode submit region end(Prohibit modification and deletion) diff --git "a/Week_02/G20200343040334/project/test/242.\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/Week_02/G20200343040334/project/test/242.\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..dc30dc9b --- /dev/null +++ "b/Week_02/G20200343040334/project/test/242.\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,78 @@ +package main + +import "fmt" + +/** +//给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 +// +// 示例 1: +// +// 输入: s = "anagram", t = "nagaram" +//输出: true +// +// +// 示例 2: +// +// 输入: s = "rat", t = "car" +//输出: false +// +// 说明: +//你可以假设字符串只包含小写字母。 +// +// 进阶: +//如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? +// Related Topics 排序 哈希表 + + +//leetcode submit region begin(Prohibit modification and deletion) +func isAnagram(s string, t string) bool { + +} +//leetcode submit region end(Prohibit modification and deletion) + + */ +func main() { + //res := isAnagram1("awdwwq", "awdqww") + res := isAnagram2("awdwwq", "awdqww") + fmt.Println(res) +} + +/** + 2个数组,存放2个字符串的出现的次数 + 存在就+1 + 比较数组是否等 + */ +func isAnagram1(s , t string) bool { + a := [26]int{} + b := [26]int{} + for _, v := range s{ + a[v-'a'] += 1 + fmt.Println(" v :", v, " v-a ", v - 'a') + } + for _, v := range t{ + b[v-'a'] += 1 + } + return a == b +} + +/** + 1个数组,存放字符串26字母 + 出现在s字符+1 + 出现在t字符-1 + 遍历每个元素是否等0 + */ +func isAnagram2(s, t string) bool { + a := [26]int{} + for _, v := range s { + a[v-'a']++ + } + for _, v := range t { + a[v-'a']-- + } + for _, v := range a { + if v != 0{ + return false + } + } + return true +} diff --git "a/Week_02/G20200343040334/project/test/365.\346\260\264\345\243\266\351\227\256\351\242\230/main.go" "b/Week_02/G20200343040334/project/test/365.\346\260\264\345\243\266\351\227\256\351\242\230/main.go" new file mode 100644 index 00000000..90297f14 --- /dev/null +++ "b/Week_02/G20200343040334/project/test/365.\346\260\264\345\243\266\351\227\256\351\242\230/main.go" @@ -0,0 +1,33 @@ +package main + +import "fmt" + +func main() { + fmt.Println(canMeasureWater(2,1,3)) +} + +func canMeasureWater(x int, y int, z int) bool { + if x + y < z{ + return false + } + if x ==0 || y == 0{ + return z ==0 || x+y == z + } + fmt.Println(gcd(x, y)) + fmt.Println(z % gcd(x, y)) + return z % gcd(x, y) == 0 +} + +func gcd(i,j int) int{ + if i > j{ + i,j = j, i + } + if i ==1{ + return 1 + } + y := j % i + if y ==0{ + return i + } + return gcd(i, y) +} diff --git "a/Week_02/G20200343040334/project/test/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/main.go" "b/Week_02/G20200343040334/project/test/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/main.go" new file mode 100644 index 00000000..a795d723 --- /dev/null +++ "b/Week_02/G20200343040334/project/test/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/main.go" @@ -0,0 +1,51 @@ +package main + +import "fmt" + +//给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 +// +// 示例: +// +// 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], +//输出: +//[ +// ["ate","eat","tea"], +// ["nat","tan"], +// ["bat"] +//] +// +// 说明: +// +// +// 所有输入均为小写字母。 +// 不考虑答案输出的顺序。 +// +// Related Topics 哈希表 字符串 + +func main() { + fmt.Println(groupAnagram([]string{"eat", "tea", "tan", "ate", "nat", "bat"})) +} + +// 每个字符串遍历组成一个唯一的指数下标 +// hash得到key 判断是否存在 +// 如果不存在则初始化,否则append +func groupAnagram(strs []string) [][]string { + cnt := 0 + prime := []int{2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103} // 用26个质数代表26个字母 + hash := map[int]int{} + var ans [][]string + for _, s := range strs{ + t := 1 + for _,v := range s{ + t *= prime[v - 'a'] + } + if _,ok := hash[t]; !ok{ + hash[t] = cnt + ans = append(ans, []string{}) + ans[cnt] = []string{} + cnt ++ + } + ans[hash[t]] = append(ans[hash[t]], s) + } + return ans +} diff --git "a/Week_02/G20200343040334/project/test/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/note.md" "b/Week_02/G20200343040334/project/test/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/note.md" new file mode 100644 index 00000000..c369e641 --- /dev/null +++ "b/Week_02/G20200343040334/project/test/49. \345\255\227\346\257\215\345\274\202\344\275\215\350\257\215\345\210\206\347\273\204/note.md" @@ -0,0 +1,26 @@ +//给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 +// +// 示例: +// +// 输入: ["eat", "tea", "tan", "ate", "nat", "bat"], +//输出: +//[ +// ["ate","eat","tea"], +// ["nat","tan"], +// ["bat"] +//] +// +// 说明: +// +// +// 所有输入均为小写字母。 +// 不考虑答案输出的顺序。 +// +// Related Topics 哈希表 字符串 + + +//leetcode submit region begin(Prohibit modification and deletion) +func groupAnagrams(strs []string) [][]string { + +} +//leetcode submit region end(Prohibit modification and deletion) diff --git "a/Week_02/G20200343040334/project/test/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" "b/Week_02/G20200343040334/project/test/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" new file mode 100644 index 00000000..c994801e --- /dev/null +++ "b/Week_02/G20200343040334/project/test/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242.md" @@ -0,0 +1,24 @@ +https://leetcode-cn.com/problems/largest-rectangle-in-histogram/ +84. 柱状图中最大的矩形 +给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 + +求在该柱状图中,能够勾勒出来的矩形的最大面积。 + + + + + +以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。 + + + + + +图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。 + + + +示例: + +输入: [2,1,5,6,2,3] +输出: 10 diff --git "a/Week_02/G20200343040334/project/test/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/main.go" "b/Week_02/G20200343040334/project/test/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/main.go" new file mode 100644 index 00000000..2c382526 --- /dev/null +++ "b/Week_02/G20200343040334/project/test/84. \346\237\261\347\212\266\345\233\276\344\270\255\346\234\200\345\244\247\347\232\204\347\237\251\345\275\242/main.go" @@ -0,0 +1,50 @@ +package main + +import "fmt" + +func main() { + arr := []int{2,1,5,6,2,3} + //arr := []int{1,2,45,3,56,32,42,3,1} + result := largestRectangleArea(arr) + //result := largestRectangleAreatest(arr) + fmt.Println("result = ", result) +} + +// 1.暴力(根据宽找高度): +// 两个柱子之间的最大矩形,由最矮柱子决定,所以在两个指针的遍历中找到最矮柱子 +// 2.分治:最矮柱子的矩形宽可以无限延伸。找到左右边界范围内的最矮柱子,求以它为高的矩形、其左、右柱子中(子问题)矩形最大面积的最大值。 +// 3.优化分治:用线段树代替遍历找到最矮柱子。 +// 4.升序栈(根据高度找宽):对于每个高度来说,往左右两个方向寻找第一个比它矮的柱子,决定矩形的宽。 +// 所以用高度升序栈保存索引,遇到减小的,表示找到右边界。计算这中间每个柱子的最大矩形,计算一个即出栈,这样方便每次从栈顶取索引。 +// 时间复杂度:O(n), n个数字每个会被压栈弹栈各一次。 +// 空间复杂度:O(n)。用来存放栈中元素。 + +// 首尾添加负数高度,这样原本的第一个高度能形成升序,原本的最后一个高度也能得到处理 +func largestRectangleArea(heights []int) int{ + heights = append([]int{-2}, heights...) + heights = append(heights, -1) + length := len(heights) + stack := make([]int, 1, length) + maxRes := 0 + i := 1 + for i < length{ + if heights[stack[len(stack)-1]] < heights[i]{ + stack = append(stack, i) + i++ + fmt.Println(i," append stack : ", stack) + continue + } + fmt.Println(i," first stack : ", stack) + maxRes = max(maxRes, heights[stack[len(stack)-1]] * (i-stack[len(stack)-2]-1)) + fmt.Println("maxRes : ", maxRes, " i : ", i) + fmt.Println("old stack : ", stack) + stack = stack[:(len(stack)-1)] + fmt.Println("end stack : ", stack) + } + return maxRes +} + +func max(a, b int) int { + if a > b {return a} + return b +} diff --git "a/Week_02/G20200343040334/project/test/945.\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217/main.go" "b/Week_02/G20200343040334/project/test/945.\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217/main.go" new file mode 100644 index 00000000..acf19605 --- /dev/null +++ "b/Week_02/G20200343040334/project/test/945.\344\275\277\346\225\260\347\273\204\345\224\257\344\270\200\347\232\204\346\234\200\345\260\217\345\242\236\351\207\217/main.go" @@ -0,0 +1,48 @@ +package main + +import ( + "fmt" + "sort" +) + +func main() { + arr := []int{3,2,1,2,1,7} + fmt.Println(minIncrementForUnique1(arr)) + fmt.Println(minIncrementForUnique(arr)) +} + +func minIncrementForUnique(arr []int) int { + sort.Ints(arr) + res, value := 0, arr[0] + for i := 1; i < len(arr); i++ { + if arr[i] <= value{ + value ++ + res += value-arr[i] + arr[i] += value-arr[i] + }else { + value = arr[i] + } + } + return res +} + +var pos []int +func minIncrementForUnique1(A []int) int { + pos = make([]int, 8000) + move := 0 + for _, a := range A{ + b := findPos(a) + move += b-a + } + return move +} + +func findPos(a int) int { + if pos[a] == 0{ + pos[a] = a + return a + } + b := findPos(a+1) + pos[a]=b + return b +} From 16295059ab6ee2f95f39f13f6c65fd0af2e17d1b Mon Sep 17 00:00:00 2001 From: melody-li <56539029+melody-li@users.noreply.github.com> Date: Tue, 24 Mar 2020 17:28:05 +0800 Subject: [PATCH 4/4] Delete .gitignore --- .gitignore | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a505ae07..00000000 --- a/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -*.swp -.idea