📅  最后修改于: 2023-12-03 15:40:16.375000             🧑  作者: Mango
给定一个整数数组和整数k,找到包含最小元素的子数组,使得子数组中的所有元素都严格大于k,如果不存在这样的子数组,则返回整个数组。
定义两个指针start和end,初始都指向数组第一个元素,这样的话我们就有了一个初始的子数组,然后我们不断移动end指针,直到子数组中的所有元素都大于k为止。此时,我们记录下这个子数组的长度,并将start指针向右移动,直到子数组中的元素不再全部大于k,也就是说,我们找到了以当前start指针为起点的最小子数组。然后我们继续移动end指针,重复上述过程,直到end指针到达数组尾部。
以下为Python实现:
def min_subarray(arr, k):
n = len(arr)
start = end = 0
res = float('inf')
while end < n:
while end < n and arr[end] <= k: # 跳过所有小于等于k的元素
end += 1
if end == n: # 如果到达数组尾部,直接返回整个数组
return arr
while start < n and arr[start] > k: # 移动start指针直到子数组中的首个元素小于等于k
start += 1
if start == n: # 如果到达数组尾部,直接返回整个数组
return arr
res = min(res, end-start+1) # 更新最小子数组的长度
start += 1 # 移动start指针,继续寻找下一个最小子数组
return arr[:res]
assert min_subarray([2, 3, 1, 2, 4, 3], 3) == [4, 3]
assert min_subarray([2, 3, 1, 2, 4, 3], 5) == [2, 3, 1, 2, 4, 3]
assert min_subarray([2, 3, 1, 2, 4, 3], 1) == [2]