数据结构:重叠区间的个数

本文首发为CSDN博客,地址为:http://blog.csdn.net/xxzhangx/article/details/53544822

欢迎关注,谢谢!引用转载请注明作者和地址!

题目:给定多个可能的重叠的区间,找出重叠区间的个数。

伪代码:

区间的定义如下:

class Interval{
  int start; //起点
  int end;  //止点
  Interval (int a,int b){
    start =a;
    end = b;
  }
}

首先,要定义区间的类,实现Comparable接口,含有起点与止点的值和类型,还要重写用于排序的compareTo函数。

class Point implements Comparable<Point>{
  int value;//数值
    int type;//点的类型,0为起点,1为止点
    Point (int v,int t){
      value = v;
      type = t;
    }
  //还需要实现compareTo函数,以便排序
    public int compareTo(Point p){
      if (this.value == p.value){
        return 0;
      }else if (this.value > p.value){
        return 1;
      }else {
        return -1;
      }
    }
}

其次,区间转换为点,并将点排序,然后统计重叠的个数。


int getOverlappingCount(Interval[] A){
  int max =0,count = 1;
  if (A == null || A.length == 0) return max;
  Point [] points = new Point[A.length*2];
  for (int i=0;i<A.length;i++){//转为可排序的点
      points[2*i] = new Point(A[i].start,0);
      points[2*i+1] = new Point(A[i].end,1);
  }
  Collections.sort(points);//排序
    for(int i =0;i<points.length;i++){
      if(points[i].type==0){
        count++;//起点
          max = Math.max(max,count);
      }else{
        count--;
      }
    }
  return max;
}

R语言

这里没有按照伪代码中给的样式来写,源于没有发现R语言中能采用这种方式来写,在谷歌是发现一个R包intervals,它可以实现overlap功能,也就是我们这里将用到的交集。

两个区间集合之间的重叠个数计算:

> a=matrix(c(1:16),ncol = 2, byrow = TRUE)
> a
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
[4,]    7    8
[5,]    9   10
[6,]   11   12
[7,]   13   14
[8,]   15   16
> to <- Intervals(a,closed = c( TRUE, FALSE ),type = "R")
> #集合to
> to
Object of class Intervals
8 intervals over R:
[1, 2)
[3, 4)
[5, 6)
[7, 8)
[9, 10)
[11, 12)
[13, 14)
[15, 16)
> dim(to)
[1] 8 2
> b <- matrix(c(2.121, 8,8, 9,6, 9,11, 12,3, 3),ncol = 2, byrow = TRUE)
> b
       [,1] [,2]
[1,]  2.121    8
[2,]  8.000    9
[3,]  6.000    9
[4,] 11.000   12
[5,]  3.000    3
> from <- Intervals(b,closed = c( FALSE, FALSE ),type = "R")
> # 集合from
> from
Object of class Intervals
5 intervals over R:
(2.121, 8)
(8, 9)
(6, 9)
(11, 12)
(3, 3)
> rownames(from) <- c(1:nrow(from))
> empty(to)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> empty(from)
[1] FALSE FALSE FALSE FALSE  TRUE
> b1 <- interval_overlap(from, to)
Warning message:
Some empty 'from' intervals encountered. Setting to NA... 
> b1
$`1`
[1] 2 3 4

$`2`
integer(0)

$`3`
[1] 4

$`4`
[1] 6

$`5`
integer(0)

> sum(lengths(b1))
[1] 5

关于区间是开区间还是闭区间,可以通过对closed 设置来改变,不同的区间还可以用append 来附加。

对于输入的是一个集合,计算一个集合内的区间重叠数

例子1

> b <- matrix(c(2, 8,8, 9,6, 9,11, 12,3, 3),ncol = 2, byrow = TRUE)
> b
     [,1] [,2]
[1,]    2    8
[2,]    8    9
[3,]    6    9
[4,]   11   12
[5,]    3    3
> from <- Intervals(b,closed = c( T, T ),type = "R")
> from
Object of class Intervals
5 intervals over R:
[2, 8]
[8, 9]
[6, 9]
[11, 12]
[3, 3]
> b1 <- interval_overlap(from, from)
> b1
[[1]]
[1] 1 2 3 5

[[2]]
[1] 1 2 3

[[3]]
[1] 1 2 3

[[4]]
[1] 4

[[5]]
[1] 1 5

> (sum(lengths(b1))-nrow(b))/2
[1] 4



例子2


> b <- matrix(c(1, 5,10, 15,5, 10,20, 30),ncol = 2, byrow = TRUE)
> b
     [,1] [,2]
[1,]    1    5
[2,]   10   15
[3,]    5   10
[4,]   20   30
> from <- Intervals(b,closed = c( T, T ),type = "R")
> from
Object of class Intervals
4 intervals over R:
[1, 5]
[10, 15]
[5, 10]
[20, 30]
> b1 <- interval_overlap(from, from)
> b1
[[1]]
[1] 1 3

[[2]]
[1] 2 3

[[3]]
[1] 1 2 3

[[4]]
[1] 4

> (sum(lengths(b1))-nrow(b))/2
[1] 2

啦啦啦啦,发现书上的结果错了。

python

这里写代码片
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 151,511评论 1 330
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 64,495评论 1 273
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 101,595评论 0 225
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,558评论 0 190
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,715评论 3 270
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,672评论 1 192
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,112评论 2 291
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,837评论 0 181
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,417评论 0 228
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,928评论 2 232
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,316评论 1 242
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,773评论 2 234
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,253评论 3 220
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,827评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,440评论 0 180
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,523评论 2 249
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,583评论 2 249

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,471评论 25 707
  • 概述排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的...
    Luc_阅读 2,207评论 0 35
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 5,093评论 0 52
  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 3,700评论 0 15
  • 今天刚给老姐买了一台新的电脑,又被硬拉过去给电脑装软件,再加一些其他杂事,一晚上便慢慢的过了。每次和姐姐在一起的时...
    Rathen阅读 550评论 3 4