判断多个区间是否相交

写一个算法判断多个区间是否存在交叉 在很久以前或许我会if else解决问题,随着工龄的增加对这种代码也是不屑一顾,思考良久出现一个方案还不错,提供给类似需求的人参观斧正

试想 多个区间在一个横坐标中 As Ad 分表标示A区间的开始结束,依次类推

—As—Ad———Bs——Cs——Bd————Cd———

在程序中要想表达A区间可以用map实现,As作为A区间的key,Ad作为A区间的value,便可实现区间的一个开始结束的对应关系的描述//是否想交

sections := make(map[float64]float64)

for _, v := range files {

        _, exist := sections[v.InsertTime]

         if exist { //如果key已经存在,那么出现依次想交即有两个Ns是重复的,抛出异常

            return errors.New(strconv.Itoa(exception.VideoSectionError) + "," + exception.MessageMap[exception.VideoSectionError])

         }

  sections[v.InsertTime] = v.InsertTime + v.Duration //组建 多区间map数据结构

}

这样就可以描述 多个区间 接下来就是判断是否想交问题咯,也是关键。

我的思想是 循环多个区间map将他们map的所有键值对加入数组,循环数组,判断数组的元素 N,的下一个元素N+1是否是Ns和Nd v

ar pave []float64 //存放区间键值对数组

for k, v := range sections { //想数组中存值

      pave = append(pave, k)

       pave = append(pave, v)

}

sort.Sort(sort.Float64Slice(pave)) //对数组进行排序

for i, startSection := range pave { //循环数组

       endSection, exist := sections[startSection] //在map数据中取 查询元素 是否为key

       if exist { //如果是key

          if endSection != pave[i+1] && startSection != pave[i+1] { //判断这个key的value是否是数组元素 startSection+1这个元素的值,如果不是,做出现咯相交

              return true

           }

       }

}

return false 到此为止,

核心思想就是多个区间在横坐标中形成一个数组,其中一个数组元素的如果为某个区间的开始那么他的下一个元素必定为这个区间的结束

转载于:https://my.oschina.net/dengdajun/blog/2961080

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值