给定两个具有整数开始和结束时间的事件,E1 =(s1,e1),E2 =(s2,e2),执行快速布尔检查以查看事件是否重叠。
我有解决方案,但我很想知道其他人想出了什么。
编辑:好的,这是我的解决方案:
e1 > s2 || (s1 > s2 && e2 < s1)
答案 0 :(得分:15)
bool overlap = (s1 <= e2) && (s2 <= e1)
答案 1 :(得分:8)
我更喜欢:
bool overlap = !(e1 < s2 || e2 < s1);
我认为这更清楚,但这是一个非常小的差异。
转换为英语:
如果两个都没有在另一个开始之前结束,它们会重叠。
这类似于重叠矩形问题。编写该测试有两种好方法。它们对应于陈述:
如果两个矩形的左边缘位于另一个边缘的左边缘,并且两者的上边缘位于另一个边缘的上边缘之上,则两个矩形重叠。
如果两个矩形都不在左侧或在另一个上方,则两个矩形重叠。
答案 2 :(得分:5)
如果出现以下情况,它们会重叠:
e1
之间(包括两个端点)s2
和e2
或 e2
之间(包括两个端点)s1
和e1
答案 3 :(得分:4)
这也有效:
max(s1, s2) < min(e1, e2)
答案 4 :(得分:2)
我会这样做:
return s1 < s2 ? s2 <= e1 : s1 <= e2;
答案 5 :(得分:1)
(S2-S1)&lt;(e1-s1)|| (S1-S2)≤(E2-S2)
答案 6 :(得分:0)
/* return true if intervals overlap */
bool overlap(unsigned int s1, unsigned int e1, unsigned int s2, unsigned int e2) {
return (s1 >= s2 && s1 <= e2) ||
(e1 >= s2 && e1 <= e2) ||
(s2 >= s1 && s2 <= e1) ||
(e2 >= s1 && e2 <= e1);
}
答案 7 :(得分:0)
(s2 < s1 && s1 < e2) || (s1 < s2 && s2 < e1)
或等同于:
(s2 < s1 && s1 < e2) || (s2 < e1 && e1 < e2)
答案 8 :(得分:0)
您可以检查哪些情况不会重叠
不重叠的条件是::(s2> e1)|| (e2> s1) 所以重叠是!((s2> e1)||(e2> s1))