
本文介绍一种高效、清晰的方法,在已排序且无重复的整数arraylist中,定位长度恰好为5的连续整数子序列,并确保其末尾元素为所有此类子序列中最大的一个。
本文介绍一种高效、清晰的方法,在已排序且无重复的整数arraylist中,定位长度恰好为5的连续整数子序列,并确保其末尾元素为所有此类子序列中最大的一个。
要解决这个问题,关键在于理解:最长为5的连续整数序列(即公差为1的等差序列)在升序列表中必然占据连续索引位置;而“末尾元素最大”的要求,意味着我们应优先检查靠近列表尾部的候选子序列——因为列表已升序排列,越靠后的合法5元连续序列,其最后一个元素自然越大。
因此,最优策略是从后往前扫描所有长度为5的连续子列表(subList),逐个验证是否满足“严格连续递增(相邻差为1)”,一旦找到第一个符合条件的子列表,即可立即返回——它必然是末尾元素最大的解。
以下是完整、可直接运行的实现:
import java.util.*;
public class ConsecutiveSequenceFinder {
/**
* 在升序无重复整数列表中查找长度为limit的连续整数子序列,
* 返回末尾元素最大的一个(即最靠右的合法子序列)
*/
public static List<integer> getMaxConsecutiveSublist(List<integer> list, int limit) {
if (list == null || list.size() = 0; i--) {
List<integer> candidate = list.subList(i, i + limit);
if (isValidConsecutive(candidate)) {
return new ArrayList(candidate); // 返回新副本,避免外部修改影响
}
}
return null; // 未找到
}
/**
* 判断子列表是否为严格连续整数序列(如 [7,8,9,10,11])
*/
private static boolean isValidConsecutive(List<integer> candidate) {
for (int i = 1; i al = Arrays.asList(3, 5, 7, 8, 9, 10, 11, 12, 14, 15);
List<integer> result = getMaxConsecutiveSublist(al, 5);
System.out.println("Length-5 consecutive sequence with largest last element: " + result);
// 输出: [8, 9, 10, 11, 12]
}
}</integer></integer></integer></integer></integer>
✅ 核心优势说明:
- 时间效率高:最坏情况仅需 O(n) 次比较(每个元素最多参与一次验证),远优于暴力回溯;
- 空间友好:利用 subList() 的视图机制,避免频繁创建新列表(仅在返回时复制结果);
- 逻辑健壮:支持任意 limit(不限于5),并内置边界校验;
- 结果可靠:因从末尾逆向扫描,首个匹配即为最优解,无需额外排序或比较。
⚠️ 注意事项:
- 输入列表必须严格升序且无重复,否则 isValidConsecutive() 可能误判;
- 若不存在长度为5的连续序列,方法返回 null,调用方应做好空值处理;
- subList() 返回的是原列表的视图,故返回前建议用 new ArrayList(...) 封装,防止意外副作用。
该方案简洁、可读性强,兼具教学性与工程实用性,适用于算法练习及实际业务中类似“最长连续段”类需求。











