/**
* @param {number[][]} intervals
* @return {number}
*/
var eraseOverlapIntervals = function(intervals) {
// 按照区间右边界排序 从小到大
// a b 是数组里的元素 a [1,2] b[2,3]
intervals.sort((a,b)=>{
return a[1]-b[1]
})
let count = 1//记录非交叉区间的个数
let end = intervals[0][1]//初始 第1个数组的第二个元素 记录区间分割点
for(let i=0;i<intervals.length;i++){
let interval = intervals[i]//把intervals里的每个元素取出来 但还是数组 不过是一维的
if(interval[0]>=end){
end = interval[1]
count+=1
}
}
return intervals.length - count
};
按照右边界排序 从左向右记录非交叉区间的个数。最后用区间总数减去非交叉区间的个数
思路
var partitionLabels = function(s) {
let hash ={} //i为字符 hash[i] 为字符出现的最后位置
for(let i=0;i<s.length;i++){//统计每一个字符最后出现的位置
hash[s[i]] = i
}
let result = []
let left = 0
let right = 0
for(let i=0;i<s.length;i++){
right = Math.max(right,hash[s[i]])//找到字符出现的最远边界
if(right===i){
result.push(right-left+1)
left = i+1
}
}
return result
};
在遍历的过程中相当于是要找每一个字母的边界,如果找到之前遍历过的所有字母的最远边界,说明这个边界就是分割点了。
字符串 s[i] 可以拿到字符串中的字符
思路
本质 判断重叠区间问题
区别 判断区间重叠后的逻辑 本题是判断区间重叠后要进行区间合并