leetcode 56. 合并区间

259 阅读1分钟

力扣题目链接
牛客题目链接

本题思路

  • 先依据每个区间的开始值从小到大排序
  • 再利用双指针从左向右尝试合并区间

牛客题目的解法如下

import "sort"
/*
 * type Interval struct {
 *   Start int
 *   End int
 * }
 */

/**
 * 
 * @param intervals Interval类一维数组 
 * @return Interval类一维数组
*/
func merge( intervals []*Interval ) []*Interval {
    // write code here
    l := len(intervals)
    if l < 2 {
        return intervals
    }
    sort.Sort(Intervals(intervals))
    // i,j 双指针
    // i和j 将intervals划分为如下几个部分
    // [0, i] 已合并完成
    // [i+1, j) 无效数据,可以被覆盖
    // [j, l) 待处理数据
    var i int
    for j := 1; j < l; j++ {
        a := intervals[i]
        b := intervals[j]
        if shouldMerge(a, b) {
            intervals[i] = mergeTwo(a, b) // 复用内存
        } else {
            i++
            if i != j { // 避免不必要的复制
                intervals[i] = b // 复用内存
            }
        }
    }
    return intervals[:i+1]
}

// 判断两个区间是否需要合并
// 返回值:true-需要合并
func shouldMerge(a, b *Interval) bool {
    if a.End < b.Start {
        return false
    }
    return true
}

// 合并两个区间
// 返回值:合并后的区间
func mergeTwo(a, b *Interval) *Interval {
    var end int
    if a.End > b.End {
        end = a.End
    } else {
        end = b.End
    }
    return &Interval{Start:a.Start, End:end}
}

// 排序需要的
type Intervals []*Interval

func (o Intervals) Len() int {
    return len(o)
}

func (o Intervals) Swap(i, j int) {
    o[i], o[j] = o[j], o[i]
}

func (o Intervals) Less(i, j int) bool {
    return o[i].Start < o[j].Start
}

力扣的题目基本一致,只不过输入参数和返回值是[][]int,读者可根据牛客题目解法自行修改。