This commit is contained in:
2026-05-31 05:06:57 +10:00
parent d54af0ced4
commit 6e099eb6fe
5 changed files with 204 additions and 0 deletions
+26
View File
@@ -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))
}
+28
View File
@@ -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))
}
+42
View File
@@ -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))
}
+57
View File
@@ -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"))
}
+51
View File
@@ -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"))
}