一、无重叠区间
右边界排序,寻找最多非重叠区间
/**
* @param {number[][]} intervals
* @return {number}
*/
var eraseOverlapIntervals = function(intervals) {
intervals.sort((a, b) => a[1] - b[1])
// 最多
let count = 1
let end = intervals[0][1]
for(let i = 1; i < intervals.length;i++) {
if(intervals[i][0] >= end) {
count++
end = intervals[i][1]
}
}
return intervals.length - count
};
左边界排序,寻找最少重叠区间
var eraseOverlapIntervals = function(intervals) {
intervals.sort((a, b) => a[0] - b[0])
let count = 0
let minRight = intervals[0][1]
for(let i = 1; i < intervals.length;i++) {
if(intervals[i][0] < minRight) {
count++
minRight = Math.min(minRight, intervals[i][1])
} else {
// 这一步,别漏了
minRight = intervals[i][1]
}
}
return count
};
左边界排序简化写法
var eraseOverlapIntervals = function(intervals) {
intervals.sort((a, b) => a[0] - b[0])
let count = 0
for(let i = 1; i < intervals.length;i++) {
if(intervals[i][0] < intervals[i-1][1]) {
count++
intervals[i][1] = Math.min(intervals[i-1][1], intervals[i][1])
}
}
return count
};
二、划分字母区间
如果找到遍历过的所有字母的最远边界,则说明这个边界就是分割点了
/**
* @param {string} s
* @return {number[]}
*/
var partitionLabels = function(s) {
let map = {}
for(let i = 0; i< s.length;i++) {
map[s[i]] = i
}
let result = []
let left = 0
let right = 0
for(let i = 0; i < s.length;i++) {
right = Math.max(right, map[s[i]])
if(i === right) {
result.push(right - left + 1)
left = right + 1
}
}
return result
};
三、合并区间
通过排序,尽量相邻区间重叠,判断重叠后更新右边界,右边界为两个重叠区间右边界的最大值
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function(intervals) {
if(!intervals.length) {
return []
}
intervals.sort((a, b) => a[0] - b[0])
let result = [intervals[0]]
for(let i= 1;i<intervals.length;i++) {
if(intervals[i][0] <= result[result.length - 1][1]) {
result[result.length - 1][1] = Math.max(result[result.length - 1][1], intervals[i][1])
} else {
result.push(intervals[i])
}
}
return result
};