题一:无重叠区间
题目链接: 无重叠区间
解题思路: 暴力
解题代码:
var eraseOverlapIntervals = function (intervals) {
intervals.sort((a, b) => a[0] - b[0]);
let startIndex = 0;
let count = 0;
while (startIndex < intervals.length) {
let curIndex = startIndex;
let start = intervals[curIndex][0];
let end = intervals[curIndex][1];
let tempCount = 0;
while (curIndex < intervals.length - 1) {
if ((start < intervals[curIndex + 1][0] && end > intervals[curIndex + 1][0]) || intervals[curIndex + 1][0] === start) {
// 重叠
start = intervals[curIndex + 1][0];
end = intervals[curIndex + 1][1] > end ? end : intervals[curIndex + 1][1];
count++;
startIndex++;
}
curIndex++;
}
startIndex++;
}
return count;
};
题二: 划分字母区间
题目链接: 划分字母区间
解题思路: 暴力
解题代码:
var partitionLabels = function (s) {
let arr = s.split('');
// 先去重
var newArr = arr.filter(function (item, index) {
return arr.indexOf(item) === index; // 因为indexOf 只能查找到第一个
});
let positionMap = [];
// 获取每个字母的覆盖范围
newArr.forEach(key => {
let start = arr.indexOf(key);
let end = arr.lastIndexOf(key);
positionMap.push([start, end]);
})
let start = 0;
let end = 0;
let endarr = [];
// 遍历切割
for (let i = 0; i < positionMap.length; i++) {
// 切割完一段的时候
if (positionMap[i][0] > end) {
endarr.push(end + 1 - start);
start = end + 1;
}
if (end < positionMap[i][1]) {
end = positionMap[i][1];
};
}
endarr.push(end + 1 -start);
return endarr;
};
题三:合并区间
题目链接: 合并区间
解题思路: 暴力
解题代码:
var merge = function (intervals) {
intervals.sort((a, b) => a[0] - b[0]);
let result = [];
let startIndex = 0;
while (startIndex < intervals.length) {
let curIndex = startIndex;
let start = intervals[startIndex][0];
let end = intervals[startIndex][1];
while (curIndex < intervals.length - 1) {
if (start <= intervals[curIndex + 1][0] && end >= intervals[curIndex + 1][0]) {
// 俩节点有相交处 可以合并
end = intervals[curIndex + 1][1] > end ? intervals[curIndex + 1][1] : end;
startIndex++;
}
curIndex++;
}
result.push([start, end]);
startIndex++;
}
return result;
};