面试题6:重叠区间个数

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

举例

    输入:[1,5],[10,15],[5,10],[20,30]

    输出:3


解法一:常规解法,就是我们一上来,最先想到的方法就是使用暴力破解,直接扫描,先第一个区间开始,看这个区间是不是在后面其他区间里面,两两区间判断是否重叠的方式,用一个数组存放区间是否存在重叠,如果两个区间重叠,比如第一个区间和第五个区间重叠,则把数组下标0,4这个两个设置为true,或其他标识。当第一个区间扫描完后面的区间,换到第二个区间。。。直到最后一个区间。最后面扫描这个数组,计算标识过的个数,即重叠区间个数。这种方法的时间复杂度达到O(n^2)


解法二:

(1)将区间值放入到结构体数组中{值,开始或者结束,第几个区间}

(2)对这个结构体数组进行排序(规则:值从小到大,相同的值按起始点为先,值相同且都是起点值,则按照之前数组顺序)

(3)然后开始找哪些区间属于叠加区间的,用一个count=0标记,遇到开始值,则count++,否则count--,如果count>1,则说明当且区间与某个区间重叠,如果前一个值是一个区间的开始值,则会重叠,则标记这两个区间,否则标记当前区间,重复,直到区间遍历完成。

(4)遍历数组,计算出现的区间数

(5)返回最大叠加区间数

例如:

给定一个区间:[1,5],[2,3],[5,10],[6,12],[15,20],根据上面的分析思路,可以得出以下步骤

[1,5],[2,3],[5,10],[6,12],[15,20]

 0  1    0  1     0   1      0   1       0   1

1    1   2   2    3    3     4    4      5   5

(1)构造结构体数组:{1,0,1},{5,1,1},{2,0,2},{3,1,2},{5,0,3},{10,1,3},{6,0,4},{12,1,4},{15,0,5},{20,1,5}

(2)排序之后:{1,0,1}{2,0,2}{3,1,2}{5,0,3}{5,1,1}{6,0,4}{10,1,3}{12,1,4}{15,0,5}{20,1,5}

(3)这边一共有5个区间,所以定义一个长度为5的bool数组flag[5],初始为false,如果为叠加区间,则设为true,

    {1,0,1},这边为0,所以count++,count值1

   {2,0,2},这边为0,所以count++,count值2,又因为前面一个是0,所以该区间与上一个值对于的区间存在重叠,flag[0]=flag[1]=true

    {3,1,2},这边为1,所以count--,count值1

    {5,0,3},这边为0,所以count--,count值2,flag[2]=true

    {5,1,1},这边为1,所以count--,count值1

    {6,0,4},这边为0,所以count++,count值2,flag[3]=true

    {10,1,3},这边为1,所以count--,count值1

    {12,1,4},这边为1,所以count--,count值0

    {15,0,5},这边为0,所以count++,count值1

    {20,1,5},这边为1,所以count--,count值0


遍历数组:叠加区间有四个



代码实现如下:

package main
 
import (
    "fmt"
    "sort"
)
 
type Interval struct {
    start int
    end   int
}
 
type PointSlice []Point
 
func (p PointSlice) Len() int { // 重写 Len() 方法
    return len(p)
}
 
func (p PointSlice) Swap(i, j int) { // 重写 Swap()方法
    p[i], p[j] = p[j], p[i]
}
 
func (p PointSlice) Less(i, j int) bool { // 重写 Less
    if (p[i].v < p[j].v) ||
        (p[i].v == p[j].v && p[i].t == 0 && p[j].t == 1) {
        return true
    }
    return false
}
 
type Point struct {
    v int
    t int
    n int
}
 
func getOverlappingCount(a []Interval) int {
    max, count, length := 0, 0, len(a)
    if length == 0 || length == 1 {
        return length
    }
    points := make([]Point, length*2)
    for i := 0; i < length; i += 1 {
        points[i*2] = Point{a[i].start, 0, i}
        points[i*2+1] = Point{a[i].end, 1, i}
    }
    flag := make([]bool, length)
    // 排序
    sort.Sort(PointSlice(points))
    length *= 2
    for i := 0; i < length; i += 1 {
        if points[i].t == 0 {
            count++
        } else {
            count--
        }
        if count > 1 {
            flag[points[i].n] = true
            if points[i].t == 0 {
                flag[points[i-1].n] = true
            }
        }
    }
    length /= 2
    for i := 0; i < length; i += 1 {
        if flag[i] {
            max += 1
        }
    }
    // 存在多个区间,但是这些区间之间都不存在重叠,那么这种情况的话,重叠区间算一个
    if max == 0 {
        max = 1
    }
    return max
}
 
func main() {
    // 测试用例
    a := []Interval{Interval{1, 5}, Interval{10, 15}, Interval{5, 10}, Interval{20, 30}}
    fmt.Println(getOverlappingCount(a))
}
 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问,以下是我的回答: 1. Spring Boot的自动配置原理: Spring Boot的自动配置是基于条件注解实现的。Spring Boot会根据classpath中的jar包、类、属性等信息,来决定是否需要给容器中添加配置类。如果需要添加,则会根据条件自动配置底层框架,如Tomcat、Redis、MySQL等。如果不需要添加,则不会添加。 2. Spring Boot导入其他的配置文件: Spring Boot可以通过在application.properties或application.yml文件中添加spring.config.import属性来导入其他的配置文件。例如,可以添加以下内容来导入另一个配置文件: ``` spring.config.import=classpath:/another-config.yml ``` 3. Spring Boot的核心注解: Spring Boot的核心注解包括@SpringBootApplication、@Configuration、@EnableAutoConfiguration和@ComponentScan。其中@SpringBootApplication是一个复合注解,包含了@Configuration、@EnableAutoConfiguration和@ComponentScan注解的功能。 4. Spring Boot的实现: Spring Boot的实现基于Spring框架,它使用了大量的注解来简化配置。它还使用了条件注解来根据不同条件自动配置底层框架。另外,Spring Boot还提供了很多starter包,可以让开发人员更加方便快速地搭建应用程序。 5. Spring Boot和Spring MVC的区别: Spring Boot是一个快速构建基于Spring的应用程序的框架,它使用了很多注解来简化配置。而Spring MVC是一个基于MVC架构的Web应用程序框架,它是Spring框架的一部分。Spring Boot可以使用Spring MVC来构建Web应用程序,但是它还可以用于构建其他类型的应用程序。 6. Spring Boot如何跨域请求: Spring Boot可以通过添加一个跨域请求的过滤器来实现跨域请求。具体来说,可以创建一个类实现javax.servlet.Filter接口,然后在类上添加@WebFilter注解,并设置urlPatterns属性来指定需要跨域请求的URL。在过滤器实现的doFilter方法中,设置Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers和Access-Control-Max-Age等跨域请求头信息即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值