灵神题目-滑动窗口-固定K值的模板

80 阅读2分钟

固定k值的模块 总结成三步:入-更新-出。

入:下标为 i 的元素进入窗口,更新相关统计量。如果 i<k−1 则重复第一步。 更新:更新答案。一般是更新最大值/最小值。 出:下标为 i−k+1 的元素离开窗口,更新相关统计量。 以下题为例:

给你字符串 s 和整数 k 。

请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。

英文中的 元音字母 为(aeiou)。

func maxVowels(s string, k int) (ans int) {
    vowel := 0
    for i, in := range s {
        // 1. 进入窗口
        if in == 'a' || in == 'e' || in == 'i' || in == 'o' || in == 'u' {
            vowel++
        }
        if i < k-1 { // 窗口大小不足 k
            continue
        }
        // 2. 更新答案
        ans = max(ans, vowel)
        // 3. 离开窗口
        out := s[i-k+1]
        if out == 'a' || out == 'e' || out == 'i' || out == 'o' || out == 'u' {
            vowel--
        }
    }
    return
}
class Solution:
    def maxVowels(self, s: str, k: int) -> int:
        vowel = 0
        ans=0
        for i, c in enumerate(s):
            if c in "aeiou":
                vowel += 1
            if i < k - 1:
                continue
            ans=max(vowel,ans)
            # 出
            if s[i - k + 1] in "aeiou":
                vowel -= 1
        print(ans)
        return  ans
         

如果是固定长度切割字符

python

 [s[i:i+length] for i in range(0, len(s), length)]
golang
func splitFixedLength(s string, length int) []string {
    var result []string
    for i := 0; i < len(s); i += length {
        end := i + length
        if end > len(s) {
            end = len(s)
        }
        result = append(result, s[i:end])
    }
    return result
}

拆炸弹 leetcode.cn/problems/de… eg: [1,2,3,4,5]给你一个i,和一个k,计算加i以后的k个数,例如, i=0;k=2,那么就是2+3=5 i=1 就是3+4=7 i=2 就是4+5

func decrypt(code []int, k int) []int {
    n := len(code)
    result := make([]int, n)

    if k == 0 {
        return result
    }

    for i := 0; i < n; i++ {
        total := 0
        if k > 0 {
            // Sum the next k elements
            for j := 1; j <= k; j++ {
                total += code[(i+j)%n]
            }
        } else {
            // Sum the previous |k| elements
            for j := 1; j <= -k; j++ {
                total += code[(i-j+n)%n]
            }
        }
        result[i] = total
    }

    return result
}

做到O(n)

class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        ans = [0] * n
        r = k + 1 if k > 0 else n
        k = abs(k)
        s = sum(code[r - k: r])  # ans[0]
        for i in range(n):
            ans[i] = s
            s += code[r % n] - code[(r - k) % n]
            r += 1
        return ans