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.
k > 0
, replace the ith
number with the sum of the next k
numbers.k < 0
, replace the ith
number with the sum of the previous k
numbers.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
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.
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.
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:
code
array and calculating the sums using the prefix sum array takes O(n) time.Space Complexity Analysis:
ans
array of size n.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.