doudou0111 2019-03-16 21:49 采纳率: 0%
浏览 153
已采纳

使用double for循环合并重叠间隔

I am trying to merge some overlapping "meeting" intervals.

Given intervals:

  [{0, 1}, {3, 5}, {4, 8}, {10, 12}, {9, 10}]

Merged intervals:

  [{0, 1}, {3, 8}, {9, 12}]

My first approach is a double for loop. However, my output comes out to be:

  [{3, 8}, {9, 12}]

Which is omitting {0, 1} in my final result.

Code:

type Meeting struct {
    startTime int
    endTime   int
}

func MergeIntervals(meetings []Meeting) []Meeting {

    var mergedMeetings []Meeting

    for i := 0; i < len(meetings); i++ {
        for j := i + 1; j < len(meetings); j++ {
            var first Meeting
            var second Meeting

            // the meeting with the earlier start time is the "first" meeting
            if meetings[i].startTime < meetings[j].startTime {
                first = meetings[i]
                second = meetings[j]
            } else {
                first = meetings[j]
                second = meetings[i]
            }

            if first.endTime >= second.startTime {
                mergedMeetings = append(mergedMeetings, Meeting{first.startTime, second.endTime})
            }
        }
    }

    return mergedMeetings
}
  • 写回答

2条回答 默认 最新

  • doutian3010 2019-03-17 00:54
    关注

    For example,

    package main
    
    import (
        "fmt"
        "sort"
    )
    
    type Interval struct {
        Lo, Hi int
    }
    
    func merge(ivs []Interval) []Interval {
        m := append([]Interval(nil), ivs...)
        if len(m) <= 1 {
            return m
        }
    
        sort.Slice(m,
            func(i, j int) bool {
                if m[i].Lo < m[j].Lo {
                    return true
                }
                if m[i].Lo == m[j].Lo && m[i].Hi < m[j].Hi {
                    return true
                }
                return false
            },
        )
    
        j := 0
        for i := 1; i < len(m); i++ {
            if m[j].Hi >= m[i].Lo {
                if m[j].Hi < m[i].Hi {
                    m[j].Hi = m[i].Hi
                }
            } else {
                j++
                m[j] = m[i]
            }
    
        }
        return append([]Interval(nil), m[:j+1]...)
    }
    
    func main() {
        intervals := []Interval{{0, 1}, {3, 5}, {4, 8}, {10, 12}, {9, 10}}
        merged := merge(intervals)
        fmt.Println(intervals)
        fmt.Println(merged)
    }
    

    Playground: https://play.golang.org/p/13uwiQtlxPJ

    Output:

    [{0 1} {3 5} {4 8} {10 12} {9 10}]
    [{0 1} {3 8} {9 12}]
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 请求分析基于spring boot+vue的前后端分离的项目
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥20 为什么我写出来的绘图程序是这样的,有没有lao哥改一下
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥200 关于#c++#的问题,请各位专家解答!网站的邀请码
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么