这一题与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
};