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

作者: Bioconductor | 来源:发表于2016-12-09 22:10 被阅读60次

本文首发为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

这里写代码片

相关文章

  • 2020-05-20-贪心算法- 重叠区间问题

    题目描述:计算让一组区间不重叠所需要移除的区间个数。计算最多能组成的不重叠区间个数,然后用区间总个数减去不重叠区间...

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

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

  • xor

    给出n个数字 a_1,...,a_n,问最多有多少不重叠的非空区间,使得每个区间内数字的xor都等于0。输入描述:...

  • [day8] [LeetCode] [title435,5]

    435. 无重叠区间 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的...

  • 715. Range 模块

    Range模块是跟踪数字范围的模块。设计一个数据结构来跟踪表示为 半开区间 的范围并查询它们。 半开区间 [lef...

  • lintcode 插入空间

    给出一个无重叠的按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如...

  • LeetCode 56 [Merge Intervals]

    原题 给出若干闭合区间,合并所有重叠的部分。 样例给出的区间列表 => 合并后的区间列表: 解题思路 首先,把区间...

  • [kuangbin带你飞]专题十二 基础DP1

    A 别人家的博客别人家的博客 题意: m个不重叠的区间的 最大值 dp[i][j]表示 在确保 第j 个数在的情...

  • T435、无重叠区间

    给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间...

  • 区间(时段)重叠判断

    业务中经常遇到判断区间是否重叠的问题: 代码如下: 思路:把区间想象成一个以为数轴。每个区间都是数轴的一部分。将区...

网友评论

    本文标题:数据结构:重叠区间的个数

    本文链接:https://www.haomeiwen.com/subject/aojymttx.html