如何求列表中符号交替的最长连续子序列长度?有没有简洁实现方案?
检测符号交替最长连续子列表的简洁实现
原有实现通过生成所有子列表逐一校验,时间复杂度为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
相关产品推荐
相关产品推荐

