区间合并

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    var reader = bufio.NewReader(os.Stdin)
    var xx = readInt(reader)
    if xx <= 1 {
        fmt.Println(xx)
        return
    }
    var a = make([][]int, xx)
    for i := 0; i < xx; i++ {
        a[i] = readArray(reader, " ")
    }

    var cnt = 1
    // 1.按左端点排序
    //quickSort(a, 0, xx-1)    // 快速排序有问题
    a = mergeSort(a)
    //fmt.Println(a)

    // 2.扫描,将存在交集的区间合并(如果不存在交集,则区间个数累计+1)
    var y = a[0][1]
    for i := 1; i < xx; i++ {
        if a[i][0] > y {
            cnt += 1
            y = a[i][1]
        } else if a[i][1] > y {
            y = a[i][1]
        }
    }

    fmt.Println(cnt)
}

func mergeSort(a [][]int) [][]int {
    if len(a) <= 1 {
        return a
    }
    return merge(mergeSort(a[:len(a)>>1]), mergeSort(a[(len(a)>>1):]))
}

func merge(a, b [][]int) [][]int {
    var (
        i   int
        j   int
        ans [][]int
    )

    for i < len(a) && j < len(b) {
        if a[i][0] <= b[j][0] {
            ans = append(ans, a[i])
            i++
        } else {
            ans = append(ans, b[j])
            j++
        }
    }

    if i < len(a) {
        ans = append(ans, a[i:]...)
    }
    if j < len(b) {
        ans = append(ans, b[j:]...)
    }
    return ans
}

func quickSort(a [][]int, start int, end int) {

    if start >= end {
        return
    }

    var (
        left  = start - 1
        right = end + 1
        mid   = left + ((right - left) >> 1)
    )

    for left < right {
        left++
        for a[left][0] < a[mid][0] {
            left++
        }

        right--
        for a[right][0] > a[mid][0] {
            right--
        }

        if left < right {
            a[left], a[right] = a[right], a[left]
        }
    }

    quickSort(a, start, right)
    quickSort(a, right+1, end)
}

func readLine(reader *bufio.Reader) string {
    var line, _ = reader.ReadString('\n')
    return strings.TrimRight(line, "\n")
}

func readInt(reader *bufio.Reader) int {
    var a, _ = strconv.Atoi(readLine(reader))
    return a
}

func readArray(reader *bufio.Reader, sep string) []int {
    var line = readLine(reader)
    var strList = strings.Split(line, sep)
    var nums = make([]int, 0)
    var err error
    var v int
    for i := 0; i < len(strList); i++ {
        if v, err = strconv.Atoi(strList[i]); err != nil {
            continue
        }
        nums = append(nums, v)
    }
    return nums
}

最后更新于

这有帮助吗?