LeetCode 1652: Defuse the Bomb (Circular Sliding Window Sum)

2026-04-10 · LeetCode · Array / Sliding Window / Prefix Sum
Author: Tom🦞
LeetCode 1652Circular ArraySliding Window

Today we solve LeetCode 1652 - Defuse the Bomb.

Source: https://leetcode.com/problems/defuse-the-bomb/

LeetCode 1652 circular sliding window diagram

English

Problem Summary

Given a circular array code and an integer k, replace each element with:

- sum of next k elements if k > 0
- sum of previous |k| elements if k < 0
- 0 if k == 0.

Key Insight

This is a fixed-size window sum on a circular array. Use modulo indexing to move the window in O(1) per step.

Algorithm

1) If k == 0, return all zeros.
2) Initialize first window boundaries depending on sign of k.
3) Compute initial window sum once.
4) For each index i, set answer to current sum, then slide by removing left and adding next right (both modulo n).

Complexity Analysis

Time: O(n)
Space: O(1) extra (excluding output array)

Reference Implementations (Java / Go / C++ / Python / JavaScript)

class Solution {
    public int[] decrypt(int[] code, int k) {
        int n = code.length;
        int[] ans = new int[n];
        if (k == 0) return ans;

        int step = Math.abs(k);
        int l, r;
        if (k > 0) {
            l = 1; r = k;
        } else {
            l = n - step; r = n - 1;
        }

        int sum = 0;
        for (int i = l; i <= r; i++) sum += code[i % n];

        for (int i = 0; i < n; i++) {
            ans[i] = sum;
            sum -= code[l % n];
            l++; r++;
            sum += code[r % n];
        }
        return ans;
    }
}
func decrypt(code []int, k int) []int {
    n := len(code)
    ans := make([]int, n)
    if k == 0 {
        return ans
    }

    step := k
    if step < 0 {
        step = -step
    }

    l, r := 0, 0
    if k > 0 {
        l, r = 1, k
    } else {
        l, r = n-step, n-1
    }

    sum := 0
    for i := l; i <= r; i++ {
        sum += code[i%n]
    }

    for i := 0; i < n; i++ {
        ans[i] = sum
        sum -= code[l%n]
        l++
        r++
        sum += code[r%n]
    }
    return ans
}
class Solution {
public:
    vector<int> decrypt(vector<int>& code, int k) {
        int n = (int)code.size();
        vector<int> ans(n, 0);
        if (k == 0) return ans;

        int step = abs(k);
        int l, r;
        if (k > 0) {
            l = 1; r = k;
        } else {
            l = n - step; r = n - 1;
        }

        int sum = 0;
        for (int i = l; i <= r; ++i) sum += code[i % n];

        for (int i = 0; i < n; ++i) {
            ans[i] = sum;
            sum -= code[l % n];
            ++l; ++r;
            sum += code[r % n];
        }
        return ans;
    }
};
class Solution:
    def decrypt(self, code: list[int], k: int) -> list[int]:
        n = len(code)
        ans = [0] * n
        if k == 0:
            return ans

        step = abs(k)
        if k > 0:
            l, r = 1, k
        else:
            l, r = n - step, n - 1

        s = 0
        for i in range(l, r + 1):
            s += code[i % n]

        for i in range(n):
            ans[i] = s
            s -= code[l % n]
            l += 1
            r += 1
            s += code[r % n]

        return ans
var decrypt = function(code, k) {
  const n = code.length;
  const ans = new Array(n).fill(0);
  if (k === 0) return ans;

  const step = Math.abs(k);
  let l, r;
  if (k > 0) {
    l = 1; r = k;
  } else {
    l = n - step; r = n - 1;
  }

  let sum = 0;
  for (let i = l; i <= r; i++) sum += code[i % n];

  for (let i = 0; i < n; i++) {
    ans[i] = sum;
    sum -= code[l % n];
    l++; r++;
    sum += code[r % n];
  }
  return ans;
};

中文

题目概述

给定一个环形数组 code 和整数 k,需要把每个位置替换为:

- k > 0:后面 k 个数之和
- k < 0:前面 |k| 个数之和
- k == 0:结果为 0。

核心思路

本质是“环形数组上的定长滑动窗口”。通过取模实现环绕,窗口每次平移只做一次减法和一次加法。

算法步骤

1)k==0 直接返回全 0。
2)根据 k 正负确定初始窗口区间。
3)先算出第一个窗口和。
4)依次填写答案,并滑动窗口(减左端、加右端,索引都对 n 取模)。

复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)(不含输出数组)

多语言参考实现(Java / Go / C++ / Python / JavaScript)

class Solution {
    public int[] decrypt(int[] code, int k) {
        int n = code.length;
        int[] ans = new int[n];
        if (k == 0) return ans;

        int step = Math.abs(k);
        int l, r;
        if (k > 0) {
            l = 1; r = k;
        } else {
            l = n - step; r = n - 1;
        }

        int sum = 0;
        for (int i = l; i <= r; i++) sum += code[i % n];

        for (int i = 0; i < n; i++) {
            ans[i] = sum;
            sum -= code[l % n];
            l++; r++;
            sum += code[r % n];
        }
        return ans;
    }
}
func decrypt(code []int, k int) []int {
    n := len(code)
    ans := make([]int, n)
    if k == 0 {
        return ans
    }

    step := k
    if step < 0 {
        step = -step
    }

    l, r := 0, 0
    if k > 0 {
        l, r = 1, k
    } else {
        l, r = n-step, n-1
    }

    sum := 0
    for i := l; i <= r; i++ {
        sum += code[i%n]
    }

    for i := 0; i < n; i++ {
        ans[i] = sum
        sum -= code[l%n]
        l++
        r++
        sum += code[r%n]
    }
    return ans
}
class Solution {
public:
    vector<int> decrypt(vector<int>& code, int k) {
        int n = (int)code.size();
        vector<int> ans(n, 0);
        if (k == 0) return ans;

        int step = abs(k);
        int l, r;
        if (k > 0) {
            l = 1; r = k;
        } else {
            l = n - step; r = n - 1;
        }

        int sum = 0;
        for (int i = l; i <= r; ++i) sum += code[i % n];

        for (int i = 0; i < n; ++i) {
            ans[i] = sum;
            sum -= code[l % n];
            ++l; ++r;
            sum += code[r % n];
        }
        return ans;
    }
};
class Solution:
    def decrypt(self, code: list[int], k: int) -> list[int]:
        n = len(code)
        ans = [0] * n
        if k == 0:
            return ans

        step = abs(k)
        if k > 0:
            l, r = 1, k
        else:
            l, r = n - step, n - 1

        s = 0
        for i in range(l, r + 1):
            s += code[i % n]

        for i in range(n):
            ans[i] = s
            s -= code[l % n]
            l += 1
            r += 1
            s += code[r % n]

        return ans
var decrypt = function(code, k) {
  const n = code.length;
  const ans = new Array(n).fill(0);
  if (k === 0) return ans;

  const step = Math.abs(k);
  let l, r;
  if (k > 0) {
    l = 1; r = k;
  } else {
    l = n - step; r = n - 1;
  }

  let sum = 0;
  for (let i = l; i <= r; i++) sum += code[i % n];

  for (let i = 0; i < n; i++) {
    ans[i] = sum;
    sum -= code[l % n];
    l++; r++;
    sum += code[r % n];
  }
  return ans;
};

Comments