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

如何求列表中符号交替的最长连续子序列长度?有没有简洁实现方案?

检测符号交替最长连续子列表的简洁实现

原有实现通过生成所有子列表逐一校验,时间复杂度为O(n²),仅适合短列表使用。我们可以通过单次遍历实现O(n)时间复杂度的解法,无需引入第三方依赖:

my_list = [-1, -0.5, 1, -3, 4, 5, 5, -1]

if not my_list:
    max_len = 0
else:
    max_len = current_len = 1
    for i in range(1, len(my_list)):
        # 相邻元素符号相反时乘积小于0,满足交替条件
        if my_list[i] * my_list[i-1] < 0:
            current_len += 1
            max_len = max(max_len, current_len)
        else:
            current_len = 1

print(max_len)

运行后直接输出结果4,和示例要求完全一致。

如果列表中可能存在0,需要将0视为单独的符号类型,可以调整判断逻辑,搭配numpy实现符号校验:

import numpy as np
my_list = [-1, -0.5, 1, -3, 0, 5, 5, -1]

if not my_list:
    max_len = 0
else:
    max_len = current_len = 1
    signs = np.sign(my_list)
    for i in range(1, len(my_list)):
        if signs[i] != signs[i-1]:
            current_len += 1
            max_len = max(max_len, current_len)
        else:
            current_len = 1

print(max_len)

如果处理超大规模列表,可以用numpy向量化操作进一步提升效率:

import numpy as np
my_list = [-1, -0.5, 1, -3, 4, 5, 5, -1]
if len(my_list) <= 1:
    max_len = len(my_list)
else:
    diff_mask = np.abs(np.diff(np.sign(my_list))) == 2
    max_len = np.max(np.cumsum(diff_mask) - np.maximum.accumulate(np.where(~diff_mask, np.cumsum(diff_mask), 0))) + 1
print(max_len)

内容的提问来源于stack exchange,提问作者Nicolas Berthier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:18:00