JZX轻语:简

LeetCode 1652 - 拆炸弹

发表于2024年05月05日

#滑动窗口 #数组

固定长度的滑动窗口题目,可以使用leftright维护一个左闭右开的滑动窗口,每次遍历的时候,该窗口向右移动一个元素即可。也可以不用上述两个变量,毕竟是固定长,可以根据遍历的数组位置计算出来。

维护窗口左右两侧指针的版本:

class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        ans = []
        left = 1 if k > 0 else (k + n) % n
        right = (1 + k + n) % n if k > 0 else 0
        i = left
        cur_sum = 0
        while i != right:
            cur_sum += code[i]
            i = (i + 1 + n) % n

        for i in range(len(code)):
            ans.append(cur_sum)
            cur_sum = cur_sum - code[left] + code[right]
            left = (left + 1 + n) % n
            right = (right + 1 + n) % n
        return ans

直接计算版本:

from itertools import islice


class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        ans = []
        cur_sum = sum(code[1:k+1] if k >= 0 else code[k:])

        for i in range(len(code)):
            ans.append(cur_sum)
            cur_sum -= code[(i + 1 + n) % n] if k >= 0 else code[(i + k + n) % n]
            cur_sum += code[(i + k + 1 + n) % n] if k >= 0 else code[i]
        return ans

闪念标签:LC

题目链接:https://leetcode.cn/problems/defuse-the-bomb/