1652. Defuse the Bomb - Detailed Explanation
Problem Statement
You are given a circular array of integers code of length n and an integer k. You want to replace each element code[i] with the sum of k numbers next to it if k > 0, or the sum of k numbers previous to it if k < 0, wrapping around the circle. If k == 0, replace every element with 0.
More formally, let ans be an array of length n. For each index i (0 ≤ i < n):
- If k > 0,ans[i] = code[(i+1) % n] + code[(i+2) % n] + … + code[(i+k) % n]
- If k < 0,ans[i] = code[(i-1+n) % n] + code[(i-2+n) % n] + … + code[(i+k+n) % n]
- If k == 0,ans[i] = 0
Return the array ans.
Examples
Example 1
Input: code = [5,7,1,4], k = 3
Output: [12,10,16,13]
Explanation:
ans[0] = 7 + 1 + 4 = 12
ans[1] = 1 + 4 + 5 = 10 (wrap around)
ans[2] = 4 + 5 + 7 = 16
ans[3] = 5 + 7 + 1 = 13
Example 2
Input: code = [1,2,3,4], k = 0
Output: [0,0,0,0]
Example 3
Input: code = [2,4,9,3], k = -2
Output: [12,5,6,13]
Explanation:
ans[0] = code[-1] + code[-2] = 3 + 9 = 12
ans[1] = code[0]  + code[-1] = 2 + 3 = 5
ans[2] = code[1]  + code[0]  = 4 + 2 = 6
ans[3] = code[2]  + code[1]  = 9 + 4 = 13
Constraints
- n == code.length
- 1 ≤ n ≤ 10⁴
- 1 ≤ code[i] ≤ 10⁵
- -10⁴ ≤ k ≤ 10⁴
Brute‑Force Approach
For each index i, sum up the required k neighbours directly, performing k additions per index. Wrap indices using modulo arithmetic.
for i in 0…n-1: sum = 0 if k > 0: for j in 1…k: sum += code[(i + j) % n] else if k < 0: for j in 1…|k|: sum += code[(i - j + n) % n] ans[i] = sum
- Time Complexity: O(n × |k|) → in worst case O(n²) if |k| ~ n
- Space Complexity: O(1) extra (O(n) output)
This is too slow when both n and |k| are large.
Optimized Sliding‑Window Approach
Observe that for k > 0, as you move from i to i+1, you remove code[(i+1) % n] from your window and add code[(i+k+1) % n]. Similarly for k < 0, you slide backwards.
Algorithm for k > 0
- Compute the sum of the first k elements after index 0:
window = code[1] + code[2] + … + code[k] ans[0] = window
- For each ifrom 1 to n−1:window = window - code[(i + 0) % n] + code[(i + k) % n] ans[i] = window
Algorithm for k < 0
Flip perspective: let K = |k|. Sum the K elements before index 0 (wrapping). Then slide similarly:
1.
window = code[n-1] + code[n-2] + … + code[n-K]
ans[0] = window
- For each ifrom 1 to n−1:window = window - code[(i - 1 - K + n*X) % n] + code[(i - 1 + n) % n] ans[i] = window
Here X is chosen so the index stays non‑negative before modulo. In practice you can keep all indices mod n.
Handling k == 0
Simply fill ans with zeros.
Complexity Analysis
- Time: O(n) — each index does O(1) work after initializing the first window
- Space: O(n) for the answer array
Step‑by‑Step Walkthrough (k > 0)
code = [5,7,1,4], k = 3, n = 4
- 
Initial window for i=0: sum of next 3 = 7+1+4 = 12 → ans[0]=12 
- 
i=1: remove code[1] (7), add code[(1+3)%4=0] (5) → window = 12−7+5 = 10 → ans[1]=10 
- 
i=2: remove code[2] (1), add code[(2+3)%4=1] (7) → window = 10−1+7 = 16 → ans[2]=16 
- 
i=3: remove code[3] (4), add code[(3+3)%4=2] (1) → window = 16−4+1 = 13 → ans[3]=13 
Common Mistakes
- Mis‑wrapping indices: forgetting to add nbefore taking% nfor negative values
- Recomputing the full sum inside the loop instead of sliding the window
- Off‑by‑one when determining which elements to subtract/add
Edge Cases
- 
k == 0: all zeros 
- 
|k| == n: window covers entire array → every ans[i] is the sum of all other elements (or all elements if including self) 
- 
n == 1: trivial, if k≠0 you keep adding the single element repeatedly 
Code Solutions
Python
Java Code
GET YOUR FREE
Coding Questions Catalog
$197

$78
$78