
本文讲解如何高效判断输入整数序列中是否存在长度至少为 n、公差为 r 的连续等差子序列,并在找到时输出前 n 个元素;否则输出提示信息。重点在于正确维护当前潜在等差序列、及时清空中断的候选序列,避免逻辑错误与重复/乱序输出。
本文讲解如何高效判断输入整数序列中是否存在长度至少为 n、公差为 r 的连续等差子序列,并在找到时输出前 n 个元素;否则输出提示信息。重点在于正确维护当前潜在等差序列、及时清空中断的候选序列,避免逻辑错误与重复/乱序输出。
要解决该问题,核心在于在线扫描输入序列的同时,动态维护一个“当前最长连续等差子序列”(以公差 r 为准),并实时检查其长度是否达到 n。
关键设计思路如下:
-
不依赖
prev变量:用列表nl的末尾元素nl[-1]替代显式prev,既简洁又避免状态不同步; -
自动重置候选序列:每当
curr - nl[-1] != r,说明当前数字无法延续已有等差关系,应立即清空nl(nl.clear()),然后重新以curr作为新等差序列的起点; -
统一追加策略:无论是否延续,都执行
nl.append(curr)—— 这确保nl始终以curr结尾,且仅包含连续、合法的等差片段; -
长度达标即终止:一旦
len(nl) == n,立刻输出*nl(空格分隔)并break,避免后续无效处理; -
利用
while-else简化控制流:若循环自然结束(未触发break),说明全程未找到满足条件的子序列,进入else分支输出失败提示。
以下是符合要求的完整实现(假设使用 yogi.scan 读取输入):
from yogi import scan
n = scan(int)
r = scan(int)
curr = scan(int)
nl = [curr] # 初始化:首个数作为等差序列起点
while curr is not None:
if curr - nl[-1] != r:
nl.clear() # 中断:丢弃之前所有不连续的候选值
nl.append(curr) # 总是将当前数加入当前等差段
if len(nl) == n:
print(*nl) # 直接输出前 n 个(已保证连续、有序、无重复)
break
curr = scan(int)
else:
print(f"No arithmetic progression found with step {r} and length at least {n}")
⚠️ 注意事项:
- 输入保证
n > 1、r > 1,且序列至少含 2 个元素,无需额外边界校验; -
nl初始设为[curr],配合后续nl.append(curr)实现“先清后加”的稳健逻辑; - 绝对不可对
nl调用set()或sorted()—— 这会破坏连续性与顺序,导致输出非法(如4 6 5或重复元素); - 若存在多个可行子序列,只需输出第一个满足条件的(即最早出现的长度为
n的连续段),本解法天然满足该要求。
该方案时间复杂度为 O(L),L 为输入序列长度;空间复杂度为 O(n),仅存储当前候选等差段,高效且鲁棒。










