{x}
blog image

Defuse the Bomb

You have a bomb to defuse, and your time is running out! Your informer will provide you with a circular array code of length of n and a key k.

To decrypt the code, you must replace every number. All the numbers are replaced simultaneously.

  • If k > 0, replace the ith number with the sum of the next k numbers.
  • If k < 0, replace the ith number with the sum of the previous k numbers.
  • If k == 0, replace the ith number with 0.

As code is circular, the next element of code[n-1] is code[0], and the previous element of code[0] is code[n-1].

Given the circular array code and an integer key k, return the decrypted code to defuse the bomb!

 

Example 1:

Input: code = [5,7,1,4], k = 3
Output: [12,10,16,13]
Explanation: Each number is replaced by the sum of the next 3 numbers. The decrypted code is [7+1+4, 1+4+5, 4+5+7, 5+7+1]. Notice that the numbers wrap around.

Example 2:

Input: code = [1,2,3,4], k = 0
Output: [0,0,0,0]
Explanation: When k is zero, the numbers are replaced by 0. 

Example 3:

Input: code = [2,4,9,3], k = -2
Output: [12,5,6,13]
Explanation: The decrypted code is [3+9, 2+3, 4+2, 9+4]. Notice that the numbers wrap around again. If k is negative, the sum is of the previous numbers.

 

Constraints:

  • n == code.length
  • 1 <= n <= 100
  • 1 <= code[i] <= 100
  • -(n - 1) <= k <= n - 1

Solution Explanation for Defuse the Bomb

This problem involves decrypting a circular array code using a key k. The decryption process replaces each number with the sum of the next k numbers (if k > 0), the previous |k| numbers (if k < 0), or 0 (if k = 0). The array is circular, meaning the next element of the last element is the first element, and vice versa.

Approach 1: Simulation (Time Complexity: O(n*|k|), Space Complexity: O(1))

This approach directly simulates the decryption process. For each element in the code array, it iterates k times to sum the relevant elements.

Time Complexity Analysis: The outer loop iterates n times (for each element in code). The inner loop iterates |k| times for each element. Therefore, the overall time complexity is O(n*|k|).

Space Complexity Analysis: We create an ans array of the same size as code to store the results. Apart from this, we use a constant amount of extra space. Hence, the space complexity is O(1) if we ignore the output array.

Approach 2: Prefix Sum (Time Complexity: O(n), Space Complexity: O(n))

This approach optimizes the process by using prefix sums. It calculates the prefix sum of a concatenated version of the code array (doubling it to handle circularity easily). This allows us to calculate the sum of any subarray in O(1) time using subtraction.

Time Complexity Analysis:

  • Creating the prefix sum array takes O(n) time.
  • Iterating through the code array and calculating the sums using the prefix sum array takes O(n) time.
  • Therefore, the overall time complexity is O(n).

Space Complexity Analysis:

  • We create a prefix sum array of size 2n, which is O(n) space.
  • We use an ans array of size n.
  • Overall, the space complexity is O(n).

Code Examples (Python, Java, C++, Go, TypeScript)

The code examples below demonstrate both approaches. Note that the prefix sum approach is significantly more efficient for larger values of n and |k|.

(Python - Approach 1: Simulation)

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

(Python - Approach 2: Prefix Sum)

from itertools import accumulate
 
class Solution:
    def decrypt(self, code: List[int], k: int) -> List[int]:
        n = len(code)
        ans = [0] * n
        if k == 0:
            return ans
        s = list(accumulate(code + code, initial=0))
        for i in range(n):
            if k > 0:
                ans[i] = s[i + k + 1] - s[i + 1]
            else:
                ans[i] = s[i + n] - s[i + k + n]
        return ans

(Java, C++, Go, TypeScript) The code for these languages would follow a similar structure to the Python examples, implementing either the simulation or the prefix sum approach. The core logic remains the same across all languages. Prefix Sum is generally preferred because of better time complexity.