华为OD机考中的双机位C卷"区间交集"题目,是典型的算法与数据结构类编程考核。这类题目主要考察候选人对基础算法的掌握程度、边界条件处理能力以及代码实现规范性。区间类问题在实际工程中非常常见,比如会议室调度、带宽分配、任务排期等场景都会用到类似算法。
这道题目的核心是给定两组区间集合,要求找出所有存在交集的区间对。看似简单,但其中隐藏着多个需要特别注意的技术细节:
最直观的解法是双重循环遍历所有区间对,检查每对区间是否有交集。这种方法时间复杂度为O(n²),在区间数量较大时性能会急剧下降。对于机考场景,通常需要更优的解法才能通过所有测试用例。
更高效的解法是先对两个区间集合分别排序,然后使用双指针技术进行遍历。具体步骤:
这种方法将时间复杂度优化到了O(nlogn),适合处理大规模数据。
首先我们需要定义区间数据结构:
java复制class Interval {
int start;
int end;
public Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
java复制public List<Interval> intervalIntersection(List<Interval> A, List<Interval> B) {
List<Interval> result = new ArrayList<>();
int i = 0, j = 0;
while (i < A.size() && j < B.size()) {
// 确定两个区间中较大的起始点和较小的结束点
int start = Math.max(A.get(i).start, B.get(j).start);
int end = Math.min(A.get(i).end, B.get(j).end);
// 如果起始点不大于结束点,说明有交集
if (start <= end) {
result.add(new Interval(start, end));
}
// 移动指针:结束较早的区间指针前移
if (A.get(i).end < B.get(j).end) {
i++;
} else {
j++;
}
}
return result;
}
在实际编码中需要特别注意以下边界情况:
完整的测试应该包含以下场景:
常规测试:
边界测试:
性能测试:
区间交集算法在现实中有广泛的应用:
提示:在华为OD实际机考中,除了正确性外,还会考察代码风格、异常处理和算法效率。建议平时练习时就要注意这些方面。