u
This commit is contained in:
@@ -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))
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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))
|
||||
}
|
||||
@@ -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"))
|
||||
}
|
||||
@@ -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"))
|
||||
}
|
||||
Reference in New Issue
Block a user