【leetcode】452. 用最少数量的箭引爆气球

69 阅读1分钟

leetcode-452.png

这一题与56题的思路差不多,56题是合并相交的区间,然后返回合并后的区间数组,这一题是返回交集(相交的部分)
这两题的区别就在代码第8行,56题返回的是合并后的区间,这里返回的是相交的部分

解法1

var findMinArrowShots = function (points) {
    points.sort((a, b) => a[0] - b[0])
    let start = points[0]
    let res = []
    for (let i = 1; i < points.length; ++i) {
        let [curS, curE] = points[i]
        if (curS <= start[1]) {
            start = [curS, Math.min(curE, start[1])]
        } else {
            res.push(start)
            start = points[i]
        }
    }
    res.push(start)
    return res.length
};

解法2

因为这里不需要返回完成的不相交数组,所以,这里也没必要记录相交的区间,可以只记录当前的相交区间 的end即可

var findMinArrowShots = function (points) {
    points.sort((a, b) => a[0] - b[0])
    let preEnd = points[0][1]
    let res = []
    let cnt = 1
    for (let i = 1; i < points.length; ++i) {
        let [curS, curE] = points[i]
        if (curS <= preEnd) {
            // 记录相交区间的结尾
            preEnd = Math.min(curE, preEnd)
        } else {
            cnt++
            preEnd = points[i][1]
        }
    }
    return cnt
};

解法3

这里的排序是用数组的end来进行升序排序,后面的逻辑就比较简单了
如果 curS(当前的开始) > preEnd(之前的结束) ,表示了一个新的开始,进行计数即可

var findMinArrowShots = function (points) {
    points.sort((a, b) => a[1] - b[1])
    let preEnd = points[0][1]
    let res = []
    let cnt = 1
    for (let i = 1; i < points.length; ++i) {
        let [curS, curE] = points[i]
        if (curS > preEnd) {
            cnt++
            preEnd = curE
        }
    }
    return cnt
};