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 theith
number with the sum of the nextk
numbers. - If
k < 0
, replace theith
number with the sum of the previousk
numbers. - If
k == 0
, replace theith
number with0
.
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
Approach 01:
-
C++
-
Python
#include <bits/stdc++.h> using namespace std; class Solution { public: vector<int> decrypt(vector<int>& code, int k) { int n = code.size(); vector<int> result(n, 0); // If k is 0, return an array of zeros if (k == 0) { return result; } // For positive k, sum the next k elements if (k > 0) { for (int i = 0; i < n; ++i) { int total = 0; for (int j = 1; j <= k; ++j) { total += code[(i + j) % n]; } result[i] = total; } } else { // For negative k, sum the previous k elements k = abs(k); for (int i = 0; i < n; ++i) { int total = 0; for (int j = 1; j <= k; ++j) { total += code[(i - j + n) % n]; } result[i] = total; } } return result; } };
from typing import List class Solution: def decrypt(self, code: List[int], k: int) -> List[int]: n = len(code) # If k is 0, return an array of zeros if k == 0: return [0] * n result = [0] * n if k > 0: # For positive k, sum the next k elements extendedCode = code + code[:k] for i in range(n): result[i] = sum(extendedCode[i + 1:i + k + 1]) else: # For negative k, sum the previous k elements k = abs(k) extendedCode = code[-k:] + code for i in range(n): result[i] = sum(extendedCode[i:i + k]) return result
Time Complexity
- Initialization:
Creating the
result
vector of sizen
takes \( O(n) \) time. - When
k == 0
:If
k
is zero, the function returns an array of zeros in \( O(n) \) time. - When
k > 0
:For each element in the array (
n
elements), the function sums up the nextk
elements using a loop that runs \( O(k) \) times.Thus, the overall time complexity is \( O(n \times k) \).
- When
k < 0
:Similarly, for negative
k
, the function sums up the previousk
elements, which also takes \( O(n \times k) \) time. - Overall Time Complexity:
The overall time complexity is \( O(n \times |k|) \).
Space Complexity
- Result Vector:
The algorithm uses a
result
vector of sizen
to store the output, which takes \( O(n) \) space. - Auxiliary Variables:
Other variables such as
n
,k
, andtotal
require constant space \( O(1) \). - Overall Space Complexity:
The overall space complexity is \( O(n) \) due to the
result
vector.