From 6e099eb6feb3647e947b590017ae846abe279b0a Mon Sep 17 00:00:00 2001 From: nite Date: Sun, 31 May 2026 05:06:57 +1000 Subject: [PATCH] u --- top-100-liked/10_1_test.go | 26 +++++++++++++++++ top-100-liked/10_test.go | 28 +++++++++++++++++++ top-100-liked/11_test.go | 42 ++++++++++++++++++++++++++++ top-100-liked/8_test.go | 57 ++++++++++++++++++++++++++++++++++++++ top-100-liked/9_test.go | 51 ++++++++++++++++++++++++++++++++++ 5 files changed, 204 insertions(+) create mode 100644 top-100-liked/10_1_test.go create mode 100644 top-100-liked/10_test.go create mode 100644 top-100-liked/11_test.go create mode 100644 top-100-liked/8_test.go create mode 100644 top-100-liked/9_test.go diff --git a/top-100-liked/10_1_test.go b/top-100-liked/10_1_test.go new file mode 100644 index 0000000..9d5b4ee --- /dev/null +++ b/top-100-liked/10_1_test.go @@ -0,0 +1,26 @@ +package top100liked + +import "testing" + +// https://leetcode.cn/problems/continuous-subarray-sum/ + +func checkSubarraySum(nums []int, k int) bool { + idx := make(map[int]int) + cur := 0 + idx[0] = -1 + for i, v := range nums { + cur += v + if j, ok := idx[cur%k]; ok { + if i-j >= 2 { + return true + } + } else { + idx[cur%k] = i + } + } + return false +} + +func TestS10_1(t *testing.T) { + println(checkSubarraySum([]int{23, 2, 6, 4, 7}, 13)) +} diff --git a/top-100-liked/10_test.go b/top-100-liked/10_test.go new file mode 100644 index 0000000..3c0fcf2 --- /dev/null +++ b/top-100-liked/10_test.go @@ -0,0 +1,28 @@ +package top100liked + +import "testing" + +// https://leetcode.cn/problems/subarray-sum-equals-k/description/?envType=study-plan-v2&envId=top-100-liked +// 这题好难,理解不能 + +func subarraySum(nums []int, k int) int { + freq := make(map[int]int) + freq[0] = 1 + cur := 0 + res := 0 + for _, v := range nums { + cur += v + if f, ok := freq[cur-k]; ok { + res += f + } + freq[cur]++ + } + return res +} + +func TestS10(t *testing.T) { + println(subarraySum([]int{1, 1, 1}, 2)) + println(subarraySum([]int{1, 2, 3}, 3)) + println(subarraySum([]int{1}, 0)) + println(subarraySum([]int{-1, -1, 1}, 0)) +} diff --git a/top-100-liked/11_test.go b/top-100-liked/11_test.go new file mode 100644 index 0000000..2a3a15f --- /dev/null +++ b/top-100-liked/11_test.go @@ -0,0 +1,42 @@ +package top100liked + +import ( + "fmt" + "testing" +) + +// https://leetcode.cn/problems/sliding-window-maximum/?envType=study-plan-v2&envId=top-100-liked + +func maxSlidingWindow(nums []int, k int) []int { + if len(nums) == 0 || k == 0 { + return []int{} + } + + deque := make([]int, 0) // 存下标,单调递减(对应值) + result := make([]int, 0, len(nums)-k+1) + + for i := 0; i < len(nums); i++ { + // 1. 从队尾移除所有 <= nums[i] 的下标 + for len(deque) > 0 && nums[deque[len(deque)-1]] <= nums[i] { + deque = deque[:len(deque)-1] + } + // 2. 加入当前下标 + deque = append(deque, i) + // 3. 如果队首下标已出窗口,移除 + if deque[0] < i-k+1 { + deque = deque[1:] + } + // 4. 窗口形成后,记录最大值 + if i >= k-1 { + result = append(result, nums[deque[0]]) + } + } + return result +} + +func TestS11(t *testing.T) { + fmt.Printf("%+v", maxSlidingWindow([]int{1, 3, -1, -3, 5, 3, 6, 7}, 3)) + fmt.Printf("%+v", maxSlidingWindow([]int{1}, 1)) + fmt.Printf("%+v", maxSlidingWindow([]int{9, 9, 8, 8, 7, 7, 6, 6}, 2)) + fmt.Printf("%+v", maxSlidingWindow([]int{10, 9, 8, 7, 6, 5}, 3)) +} diff --git a/top-100-liked/8_test.go b/top-100-liked/8_test.go new file mode 100644 index 0000000..ff8c4c1 --- /dev/null +++ b/top-100-liked/8_test.go @@ -0,0 +1,57 @@ +package top100liked + +import "testing" + +// https://leetcode.cn/problems/longest-substring-without-repeating-characters/?envType=study-plan-v2&envId=top-100-liked + +// func lengthOfLongestSubstring(s string) int { +// if len(s) == 0 { +// return 0 +// } +// if len(s) == 1 { +// return 1 +// } +// maxLen := 0 +// l, r := 0, 1 +// maps := make(map[byte]bool) +// maps[s[l]] = true +// for r < len(s) { +// if !maps[s[r]] { +// // 字符不存在于子串 +// maps[s[r]] = true +// } else { +// // 字符存在于字串 +// // 从子串依次剔除左侧字符直到与 s[r] 相同的字符 +// for l < r && s[l] != s[r] { +// maps[s[l]] = false +// l++ +// } +// l++ +// } +// r++ +// maxLen = max(maxLen, r-l) +// } + +// return maxLen +// } + +func lengthOfLongestSubstring(s string) int { + charIdx := make(map[byte]int) + maxLen, left := 0, 0 + slen := len(s) + for right := range slen { + ch := s[right] + if idx, ok := charIdx[ch]; ok && idx >= left { + left = idx + 1 // 直接跳到重复字符的下一个 + } + charIdx[ch] = right + maxLen = max(maxLen, right-left+1) + } + return maxLen +} + +func TestS8(t *testing.T) { + println(lengthOfLongestSubstring("abcabcbb")) + println(lengthOfLongestSubstring("bbbbb")) + println(lengthOfLongestSubstring("pwwkew")) +} diff --git a/top-100-liked/9_test.go b/top-100-liked/9_test.go new file mode 100644 index 0000000..364bfe6 --- /dev/null +++ b/top-100-liked/9_test.go @@ -0,0 +1,51 @@ +package top100liked + +import ( + "fmt" + "testing" +) + +// https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envType=study-plan-v2&envId=top-100-liked + +func findAnagrams(s string, p string) []int { + result := []int{} + if len(s) < len(p) { + return result + } + + // p 的字符计数 + pCount := [26]int{} + for i := 0; i < len(p); i++ { + pCount[p[i]-'a']++ + } + + // 窗口计数 + wCount := [26]int{} + // 先初始化第一个窗口 [0, len(p)-1] + for i := 0; i < len(p); i++ { + wCount[s[i]-'a']++ + } + + // 比较第一个窗口 + if wCount == pCount { + result = append(result, 0) + } + + // 滑动窗口 + for i := len(p); i < len(s); i++ { + // 加入新字符 + wCount[s[i]-'a']++ + // 移除左边界字符 + wCount[s[i-len(p)]-'a']-- + // 比较 + if wCount == pCount { + result = append(result, i-len(p)+1) + } + } + + return result +} + +func TestS9(t *testing.T) { + fmt.Printf("%+v", findAnagrams("cbaebabacd", "abc")) +}