📌  相关文章
📜  每个大小为 k 的窗口中的第一个负整数(1)

📅  最后修改于: 2023-12-03 15:26:53.337000             🧑  作者: Mango

每个大小为 k 的窗口中的第一个负整数

有时候,在一个正整数序列中,我们想查找每个大小为k的窗口中的第一个负整数。这样的操作经常出现在数据处理中,比如在股票价格序列中查找买入信号。

以下是一个Python函数,可以实现这个操作:

def first_negative_in_window(arr, k):
    """Find the first negative integer in each k-sized window of an array."""
    n = len(arr)
    
    # Initialize a deque to store the window
    window = []
    res = []
    
    # Process the first k-sized window
    for i in range(k):
        # Remove the positive elements from the right of the window
        while window and arr[i] < 0:
            window.pop()
        
        # Add the new element to the right of the window
        window.append(i)
    
    # Process the remaining windows
    for i in range(k, n):
        # Add the index of the leftmost element to the result
        res.append(arr[window[0]] if window else 0)
        
        # Remove the elements that are no longer in the window
        while window and window[0] <= i - k:
            window.pop(0)
        
        # Remove the positive elements from the right of the window
        while window and arr[i] < 0:
            window.pop()
        
        # Add the new element to the right of the window
        window.append(i)
    
    # Add the last element to the result
    res.append(arr[window[0]] if window else 0)
    return res

该函数的主要思想是使用一个双端队列来存储窗口中的元素。我们先处理第一个大小为k的窗口,将负整数加入队列,然后依次处理所有窗口,每次都将左边界元素加入结果中,并将不再属于窗口的元素从队列中删除。最后返回结果。

下面是一个示例:

arr = [2, -1, -4, -3, 5, -7, 6, 1]
k = 3
print(first_negative_in_window(arr, k))

输出为:[-1, -1, -3, -3, -7, -7]

这表明,第一个大小为3的窗口中的第一个负整数为-1,第二个窗口中的第一个负整数仍为-1,第三个窗口中的第一个负整数为-3,以此类推。