JZX轻语:简
LeetCode 1652 - 拆炸弹
发表于2024年05月05日
固定长度的滑动窗口题目,可以使用left
和right
维护一个左闭右开的滑动窗口,每次遍历的时候,该窗口向右移动一个元素即可。也可以不用上述两个变量,毕竟是固定长,可以根据遍历的数组位置计算出来。
维护窗口左右两侧指针的版本:
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