Let’s simplify it: You are given an array of integers. You need to find the minimum possible average of the largest and smallest elements from every possible contiguous subarray of the given array.
Before we move forward, I need to ensure that we have all the necessary details:
Assuming a general array with typical constraints (1 ≤ size of array ≤ 10^5 and integers can be negative):
Brute Force Approach: Loop through all possible subarrays, identify the maximum and minimum of each, compute their average, and track the smallest average. This approach will be computationally expensive as the number of subarrays for an array of size n
is n(n+1)/2
.
Optimized Approach: Use sliding window or data structures like deques to maintain maximum and minimum in a window. This way, we can manage the maximum and minimum efficiently without recalculating for every subarray.
We will implement the brute force approach first for simplicity, and then discuss an optimized approach if needed.
Here is the brute force approach:
# Import necessary modules
import sys
def min_avg_smallest_largest(arr):
n = len(arr)
min_avg = sys.maxsize
# Loop through all possible subarrays
for i in range(n):
current_min = arr[i]
current_max = arr[i]
for j in range(i, n):
# Update the minimum and maximum for the current subarray
current_min = min(current_min, arr[j])
current_max = max(current_max, arr[j])
# Calculate the current average
current_avg = (current_min + current_max) / 2
# Update the minimum average found
min_avg = min(min_avg, current_avg)
return min_avg
# Example usage
arr = [1, 3, 2]
print(min_avg_smallest_largest(arr)) # Output should be 1.0
To optimize, we can use two deques to maintain the minimum and maximum of the current subarray efficiently.
from collections import deque
def min_avg_smallest_largest(arr):
n = len(arr)
min_avg = float('inf')
for length in range(1, n + 1):
min_deque = deque()
max_deque = deque()
for i in range(length):
while min_deque and arr[min_deque[-1]] >= arr[i]:
min_deque.pop()
while max_deque and arr[max_deque[-1]] <= arr[i]:
max_deque.pop()
min_deque.append(i)
max_deque.append(i)
for i in range(length, n):
min_avg = min(min_avg, (arr[min_deque[0]] + arr[max_deque[0]]) / 2)
while min_deque and min_deque[0] <= i - length:
min_deque.popleft()
while max_deque and max_deque[0] <= i - length:
max_deque.popleft()
while min_deque and arr[min_deque[-1]] >= arr[i]:
min_deque.pop()
while max_deque and arr[max_deque[-1]] <= arr[i]:
max_deque.pop()
min_deque.append(i)
max_deque.append(i)
min_avg = min(min_avg, (arr[min_deque[0]] + arr[max_deque[0]]) / 2)
return min_avg
# Example usage
arr = [1, 3, 2]
print(min_avg_smallest_largest(arr)) # Output should be 1.0
Implementing and testing the optimized approach will ensure better performance with larger arrays.
Got blindsided by a question you didn’t expect?
Spend too much time studying?
Or simply don’t have the time to go over all 3000 questions?