这是重叠区间的一天
● 435. 无重叠区间
题目链接: https://leetcode.cn/problems/non-overlapping-intervals/
思路和第三十五天最后一题差不多,这次是记录未重叠的点
代码:
/**
* @param {number[][]} intervals
* @return {number}
*/
var eraseOverlapIntervals = function (intervals) {
intervals.sort((a, b) => a[0] - b[0])
let removeResult = 0;
let startPoint = intervals[intervals.length - 1]
for (let i = intervals.length - 2; i >= 0; i = i - 1) {
if (intervals[i][1] > startPoint[0]) {
removeResult = removeResult + 1
continue
}
startPoint = intervals[i]
}
return removeResult
};
● 763.划分字母区间
题目链接: 力扣 题目链接
这道题一上来就没什么思路;如何判断这一群的开始和结束位置,让相同字母个数最多;
看了卡哥的思路:首先要找到每个字母的最大边界,在不断找的过程中,会将其他字母也覆盖;获得这个最大边界的哈希表后,再遍历字符串,通过左右指针来确定终止的边界;
代码如下
var partitionLabels = function(s) {
let hash = {}
for(let i = 0; i < s.length; i = i+ 1) {
hash[s[i]] = i
}
let left = 0, right = 0, result = []
for(let k = 0; k < s.length; k = k + 1) {
right = Math.max(right, hash[s[k]]) // 找到这段字符串的最大边界,找 a 的时候也在更新 c 的
if(k === right) {
result.push(right - left + 1)
left = right + 1
}
}
return result
};
● 56. 合并区间
题目链接: . - 力扣(LeetCode)
思路:依旧是求重叠区间的题, 这里有几个细节要注意,排序之后,startPoint 第一位一定是最小值,如果 startPoint是第一位或者最后一位,那么在循环中取不到,需要在最后在 push 进数组
intervals.sort((a,b) => a[0] - b[0])
let startPoint = intervals[0]
let result = []
for(let i = 1; i < intervals.length; i = i + 1) {
if( intervals[i][0] <= startPoint[1] && intervals[i][0] >= startPoint[0]) {
startPoint = [startPoint[0], Math.max(startPoint[1], intervals[i][1])]
continue
}
result.push(startPoint)
startPoint = intervals[i]
}
result.push(startPoint)
return result