Segment
A company is performing an analysis on the computers at its main office. The computers are spaced along a single row. For each group of contiguous computers of a certain length, that is, for each segment, determine the minimum amount of disk space available on a computer. Return the maximum of these values as your answer.
Example
n = 4, the number of computers
space = [8, 2, 4, 6]
x = 2, the segment length
The free disk space of computers in each of the segments is [8, 2], [2, 4], [4, 6]. The minima of the three segments are [2, 2, 4]. The maximum of these is 4.
Function Description
Complete the function segment in the editor below.
segment has the following parameter(s):
int x: the segment length to analyze
int space[n]: the available hard disk space on each of the computers
Returns:
int: the maximum of the minimum values of available hard disk space found while analyzing the computers in segments of length x
Constraints
1 ≤ n ≤ 106
1 ≤ x ≤ n
1 ≤ space[i] ≤ 109
Input Format for Custom Testing Sample Case 0 Sample Input
STDIN Function
1 → length of segments x = 1 5 → size of space n = 5 1 → space = [1, 2, 3, 1, 2] 2 3 1 2
Sample Output
3
Explanation
The segments of size x = 1 are [1], [2], [3], [1], and [2]. Because each segment only contains 1 element, each value is minimal with respect to the segment it is in. The maximum of these values is 3.
Sample Case 1 Sample Case 2 Python 3 23242526272829303132333435363738394041424344454647484950515253545556575859606162
O(N*x)
(N-x)*x
if name == 'main': 19def segment(x, space): Line: 62 Col: 27
Input / Output
Test Cases
Console Input 1 5 1 2 3 1 2 Your Output (stdout) 3 Debug output 1 2 3 1
分析: sliding window+heapq, heapq无需保持x长度,只需要比较min不在范围时,去表头。
import heapq
def segment(x, space):
if x >= len(space):
return min(space)
max_min = float('-inf')
segs = []
for i,e in enumerate(space):
heapq.heappush(segs, (e,i))
while segs[0][1] <= i - x:
heapq.heappop(segs)
if i >= x:
max_min = max(max_min, segs[0][0])
return max_min
space = [1]
x = 10000000000000
print(segment(x, space))
deque
remplate
// Some codefor right in range(len(nums)):
# 加入右侧元素
# 维护窗口(如加入到单调队列、哈希表等)
if right >= k - 1: # 只有窗口大小达到 k 时才开始处理
# 计算当前窗口的答案(如最大值/最小值)
# 维护窗口(移除左边元素,使窗口保持大小 k)
LeetCode 239. 滑动窗口最大值
from collections import deque
def segment(x, space):
# Initialize a deque to store the indices of elements
deq = deque()
max_of_min = -float('inf')
for i in range(len(space)):
# Remove elements that are out of the current window
if deq and deq[0] < i - x + 1:
deq.popleft()
# Remove elements from the deque that are larger than the current element
while deq and space[deq[-1]] >= space[i]:
deq.pop()
# Add the current element's index to the deque
deq.append(i)
# If we have processed at least `x` elements, compute the minimum for the current window
if i >= x - 1:
max_of_min = max(max_of_min, space[deq[0]])
return max_of_min
Last updated
Was this helpful?