You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

连续锯齿子数组计数问题解法及O(n)复杂度最优实现解析

统计符合要求的锯齿连续子数组个数

问题描述

给定整数数组arr,需要统计其中满足锯齿序列定义、且长度至少为2的连续子数组的总个数。

测试用例示例

  • 示例1:arr = [9, 8, 7, 6, 5],输出为4。数组完全降序,无法构造长度≥3的锯齿子数组,仅4个长度为2的子数组符合要求。
  • 示例2:arr = [10, 10, 10],输出为0。所有元素相等,不存在符合要求的锯齿子数组。
  • 示例3:arr = [1, 2, 1, 2, 1],输出为10。该数组所有长度≥2的连续子数组都符合锯齿序列要求,总计10个。

解法说明

此前找到的参考解法存在逻辑缺陷,在测试用例[1,2,1,3,4,-2]上运行结果为12,与正确结果9不符。经过调整后得到如下时间复杂度O(n)、空间复杂度*O(1)*的正确Python实现:

def samesign(a,b):
    if a/abs(a) == b/abs(b):
        return True
    else:
        return False

def countSawSubarrays(arr):
    n = len(arr)
    
    if n < 2:
        return 0

    s = 0
    e = 1
    count = 0
    
    while(e < n):
        sign = arr[e] - arr[s]
        while(e < n and arr[e] != arr[e-1] and samesign(arr[e] - arr[e-1], sign)):
            sign = -1*sign
            e += 1
        size = e - s
        if size == 1:
            e += 1
        count += (size * (size - 1)) // 2
        s = e - 1
        e = s + 1
    return count

# 测试用例
arr1 = [9,8,7,6,5]
print(countSawSubarrays(arr1))
arr2 = [1,2,1,3,4,-2]
print(countSawSubarrays(arr2))
arr3 = [1,2,1,2,1]
print(countSawSubarrays(arr3))
arr4 = [10,10,10]
print(countSawSubarrays(arr4))

运行结果

4
9
10
0

内容的提问来源于stack exchange,提问作者Divyam Khanna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:15:06