You are given a 0-indexed array nums of n integers, and an integer k.
The k-radius average for a subarray of nums centered at some index i with the radius k is the average of all elements in nums between the indices i - k and i + k (inclusive). If there are less than k elements before or after the index i, then the k-radius average is -1.
Build and return an array avgs of length n where avgs[i] is the k-radius average for the subarray centered at index i.
The average of x elements is the sum of the x elements divided by x, using integer division. The integer division truncates toward zero, which means losing its fractional part.
2, 3, 1, and 5 is (2 + 3 + 1 + 5) / 4 = 11 / 4 = 2.75, which truncates to 2.Example 1:
Input: nums = [7,4,3,9,1,8,5,2,6], k = 3 Output: [-1,-1,-1,5,4,4,-1,-1,-1] Explanation: - avg[0], avg[1], and avg[2] are -1 because there are less than k elements before each index. - The sum of the subarray centered at index 3 with radius 3 is: 7 + 4 + 3 + 9 + 1 + 8 + 5 = 37. Using integer division, avg[3] = 37 / 7 = 5. - For the subarray centered at index 4, avg[4] = (4 + 3 + 9 + 1 + 8 + 5 + 2) / 7 = 4. - For the subarray centered at index 5, avg[5] = (3 + 9 + 1 + 8 + 5 + 2 + 6) / 7 = 4. - avg[6], avg[7], and avg[8] are -1 because there are less than k elements after each index.
Example 2:
Input: nums = [100000], k = 0 Output: [100000] Explanation: - The sum of the subarray centered at index 0 with radius 0 is: 100000. avg[0] = 100000 / 1 = 100000.
Example 3:
Input: nums = [8], k = 100000 Output: [-1] Explanation: - avg[0] is -1 because there are less than k elements before and after index 0.
Constraints:
n == nums.length1 <= n <= 1050 <= nums[i], k <= 105When you get asked this question in a real-life environment, it will often be ambiguous (especially at FAANG). Make sure to ask these questions in that case:
To find the average of subarrays within a certain range, the brute force method looks at every possible subarray. For each of those subarrays, it calculates the average by summing the numbers within it, and then divides that sum by the number of elements. Finally the averages are stored, one for each possible subarray that fit the requirements.
Here's how the algorithm would work step-by-step:
def k_radius_subarray_averages_brute_force(numbers, radius):
array_length = len(numbers)
averages = [-1] * array_length
for center_index in range(array_length):
# Check if enough elements exist to form subarray
if center_index - radius >= 0 and center_index + radius < array_length:
subarray_sum = 0
subarray_length = 2 * radius + 1
# Sum all elements within the radius
for index in range(center_index - radius, center_index + radius + 1):
subarray_sum += numbers[index]
averages[center_index] = int(subarray_sum / subarray_length)
return averagesThe key idea is to avoid recalculating the sum of each subarray. We can efficiently compute the average by reusing the sum from the previous subarray. We'll maintain a sliding window of sums and update it as we move through the input.
Here's how the algorithm would work step-by-step:
def k_radius_subarray_averages(numbers, radius):
number_of_elements = len(numbers)
result = [-1] * number_of_elements
# Not enough elements to form any averages
if number_of_elements < 2 * radius + 1:
return result
window_sum = 0
# Calculate the sum of the first window
for i in range(2 * radius + 1):
window_sum += numbers[i]
result[radius] = window_sum // (2 * radius + 1)
# Slide the window and calculate averages
for center_index in range(radius + 1, number_of_elements - radius):
window_sum -= numbers[center_index - radius - 1]
window_sum += numbers[center_index + radius]
result[center_index] = window_sum // (2 * radius + 1)
return result| Case | How to Handle |
|---|---|
| Null or empty input array nums | Return an empty array if nums is null or empty, as no averages can be calculated. |
| k is zero | Each element's average is just the element itself; return the original array. |
| k is greater than or equal to half the length of nums (k >= nums.length // 2) | The first and last k indices will not have k elements on both sides, so handle the beginning and ending indices accordingly based on the problem description's edge case handling guidelines. |
| nums array contains negative numbers | The sliding window approach will correctly calculate the average, including negative numbers. |
| nums array contains large positive numbers that could cause integer overflow during summation | Use long data type to store sums to prevent integer overflow. |
| nums array contains zero values | The sliding window approach will correctly calculate the average, including zero values. |
| nums array with very large length and large k, triggering time limit exceeded | Optimize sliding window by subtracting the leftmost element and adding the rightmost element, avoiding recalculating the sum each time. |
| All elements in nums are the same value | The sliding window approach will correctly calculate the average which will be the value of element. |