📌  相关文章
📜  最小子数组,以使所有元素都大于K(1)

📅  最后修改于: 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]