📌  相关文章
📜  长度为K的非递减子数组的数量(1)

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

求解长度为K的非递减子数组的数量

在本篇文章中,我们将探讨如何计算给定数组中长度为K的非递减子数组的数量。我们将使用Python演示实现方式。

问题描述

给定一个长度为N的数组arr和整数K,求arr中长度为K的非递减子数组的数量。非递减意味着数组中相邻元素不减少。例如,[1,2,2,3] 中的子数组 [1,2,2] 和 [2,2,3] 都是非递减的,但是 [2,1,3] 不是。

解决方案

我们可以使用滑动窗口算法来解决此问题。我们可以移动一个长度为K的窗口,检查窗口中的元素是否为非递减的。如果是,则计数器加1。

代码实现
from typing import List

def count_non_decreasing_subarrays(arr: List[int], k: int) -> int:
    count = 0
    for i in range(len(arr)-k+1):
        is_valid = True
        for j in range(i+1, i+k):
            if arr[j] < arr[j-1]:
                is_valid = False
                break
        if is_valid:
            count += 1
    return count
测试样例
arr = [1,2,2,3,4,2,2,5]
k = 3
assert count_non_decreasing_subarrays(arr, k) == 4
时间复杂度

该算法的时间复杂度为O(N*K),其中N是数组arr的长度。在最坏情况下,即数组中所有元素都相等,算法的时间复杂度为O(N^2)。