(算法)判断两个区间是否重叠

题目:

判断两个区间是否重叠

思路:

假设区间表示为[start,end],先存在两个区间A,B.

两个区间的关系有两种:重叠与不重叠

重叠的情况有4种,两种相交,两种包含(很容易想到,此处不示意)

不重叠有两种情况:A在B前面,A在B后面

因此很容易得到判断区间重叠的方法:

1、正向判断,列出四种重叠的情况,满足其一,则重叠;

2、逆向判断,列出两种不重叠的情况,如果满足其一,则重叠;

显然第二种方法更简单。

优化正向判断:

考虑一下正向判断的四种情况,其实只要满足max(A.start,B.start)<=min(A.end,B,end),即可判断A,B重叠。(由于画图比较麻烦,这里就不示意,可以在纸上试试)

代码:

#include <iostream>

using namespace std;

typedef struct{
    int start;
    int end;
}Interval;

bool isOverlap_1(Interval interval1,Interval interval2){
    if(interval1.end<interval2.start || interval1.start>interval2.end)
        return false;
    return true;
}

bool isOverlap_2(Interval interval1,Interval interval2){
    if(max(interval1.start,interval2.start)<=min(interval1.end,interval2.end))
        return true;
    return false;
}

int main()
{
    Interval interval1,interval2;
    while(1){
        if(cin>>interval1.start && cin>>interval1.end && cin>>interval2.start && cin>>interval2.end){
            if(isOverlap_2(interval1,interval2))
                cout<<"Overlap"<<endl;
            else
                cout<<"Non-overlap"<<endl;
        }

    }
    return 0;
}

  

时间: 2024-08-05 01:39:43

(算法)判断两个区间是否重叠的相关文章

判断两个区间是否重叠图解

图解:判断两个区间是否重叠 1.正向判断,列出四种重叠的情况,满足其一,则重叠: 2.逆向判断,列出两种不重叠的情况,如果满足其一,则重叠: 优化正向判断:如下图

iOS中判断两个圆是否重叠

#import <Foundation/Foundation.h> #import <math.h> @interface Point2D : NSObject { double _x; // x值 double _y; // y值 } // x值的getter和setter - (void)setX:(double)x; - (double)x; // y值的getter和setter - (void)setY:(double)y; - (double)y; // 同时设置x和y

二叉树基础算法--判断两棵二叉树是否相同

https://leetcode.com/problems/same-tree/ 1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution {

perf 对两个map是否重叠的判断,以及函数map_groups__fixup_overlappings代码逻辑

该标题可以抽象出来的问题是:两个前开后闭的区间 rangeA 和 rangeB,如何判断这两个区间是否重叠.这个问题在内核中非常重要,虚拟地址空间的划分需要它,perf中map_group的构建也需要它,下面直接给出该问题的解决思路: 找出不重叠的情况,其他的情况都是重叠的,perf中mmap__overlay函数是这样解决的: int map__overlap(struct map *l, struct map *r) {    if (l->start > r->start) { /

简单地判断判断两矩形相交/重叠 C#

最近需要用到矩形相交算法的简单应用,所以特地拿一个很简单的算法出来供新手参考,为什么说是给新手的参考呢因为这个算法效率并不是很高,但是这个算法只有简简单单的三行.程序使用了两种方法来判断是否重叠/相交,如果有兴趣可以看一下,如果觉得有bug可以留言.代码仅供参考. C#中矩形的方法为Rectangl(起始点坐标, 矩形的大小)或Rectangl(起始点x坐标, 起始点y坐标, 矩形宽, 矩形高),起始点为矩形区域的左上角. 方法一 姑且叫做“井字法”吧,延长其中一个矩形的四边使其形成一“井”字(

STL算法(15)——区间的比较

STL算法--区间的比较: equal(b,e,b2) // 用来比较两个容器中的数据是否相等 equal(b,e,b2,p) mismatch(b,e,b2)    // 用来查找两个容器中第一个不相等的数据 查找第一个不匹配算法 mismatch(b,e,b2,p) lexicographical_compare(b,e,b2,e2) //用来比较第一个区间是否比第二个区间小  ,  检查小于算法 lexicographical_compare(b,e,b2,p) #include<iost

Oracle判断两个时间段是否有重叠

判断两个时间段是否有重叠 (a,b),(c,d) 判断两段时间是否有重叠 方法一 select 'yes' from dual where d>a  and c<b; 方法二 select 'yes' from dual where (a, b) overlaps (c,d); 方法三 select 'yes' from dual where a between c and d or d between a and b;

数据结构和算法设计专题之---判断两个链表是否相交并找出交点

题目: 一个比较经典的问题,判断两个链表是否相交,如果相交找出他们的交点. 首先来看一下如何判断两个链表是否存在相交的节点: 思路: 1.碰到这个问题,第一印象是采用hash来判断,将两个链表的节点进行hash,然后判断出节点,这种想法当然是可以的. 2.当然采用暴力的方法也是可以的,遍历两个链表,在遍历的过程中进行比较,看节点是否相同. 3.第三种思路是比较奇特的,在编程之美上看到的.先遍历第一个链表到他的尾部,然后将尾部的next指针指向第二个链表(尾部指针的next本来指向的是null).

[算法]判断两个字符串是否由相同的字符组成

如何判断两个字符串是否由相同的字符组成 题目描述: 由相同的字符组成是指组成两个字符串的字母以及各个字母的个数是一样的,只是排列顺序不同而已.例如"aaaabbc"与"abcbaaa"就由相同的字符组成的. 方法一: 排序法,将两个字符串中的字符排序,比较两个排序后的字符串是否相等.若相等则表明它们是由相同的字符组成的,否则,表明他们是由不同的字符组成的. import java.util.Arrays; public class Solution { public