声明:只求用最简单的方法通过,不求优化,不喜勿喷
我觉得可能是全网最垃圾的写法了,但是我觉得和我一样思路的可能有不少,还是写一下吧,主要是一开始思路不对,后面一点一点补回来,就越写越麻烦了
- 刚开始想的是读入每一组数据之后,先判定当前的区域,有如下几种情况
- 读入数据在当前某个区域内部 —— 不做处理,结束遍历
- 读入数据包括了当前某个区域 —— 将这个区域更新为当前数据
- 读入区域右侧在某个区域内 —— 把当前区域开始点更新为读入数据的开始点
- 读入区域左侧在某个区域内 —— 把当前区域结束点更新为读入数据的结束点
- 如果没有区域和读入数据相关 —— 把读入数据输入区域内
- 然后发现问题在于,如果只更新一次上述逻辑正确,但是如果有多个区域需要处理的话,区域重叠不能处理,所以引入index和 f 作为标记,开始为f ,如果进行过一次处理则把f设置为1,并且记录处理区域在区域集中的位置,之后处理时,将处理的区域删除,保证多次处理后只留下一片区域
在这个情况下:
- 读入数据在当前某个区域内部 —— 删除区域
- 读入区域右侧在某个区域内 —— 删除当前区域,把上一次记录的区域的结束位置设置为当前处理区域的结束位置(三区域合并为一片)
- 读入区域左侧在某个区域内 —— 删除当前区域,把上一次记录的区域的开始位置设置为当前处理区域的开始位置(三区域合并为一片)
letcode已过,但是非常战胜5%,果然我失业不是没有理由的
看大佬题解去了,优化todo
/**
* @param {number[][]} intervals
* @return {number[][]}
*/
var merge = function (intervals) {
var s = [];
var e = [];
for (var i = 0; i < intervals.length; i++) {
var f = 0;
var index = -1;
for (var j = 0; j < s.length; j++) {
if (intervals[i][1] >= e[j] && intervals[i][0] <= s[j]) {
if (f == 0) {
s.splice(j, 1, intervals[i][0]);
e.splice(j, 1, intervals[i][1]);
index = j
f = 1;
} else {
s.splice(j, 1);
e.splice(j, 1);
j--;
}
}
else if (intervals[i][1] <= e[j] && intervals[i][0] >= s[j]) {
f = 1;
break;
}
else if (intervals[i][0] <= e[j] && intervals[i][0] >= s[j]) {
if (f == 0) {
e.splice(j, 1, Math.max(intervals[i][1], e[j]));
index = j;
f = 1;
} else {
s.splice(index, 1, s[j]);
s.splice(j, 1);
e.splice(j, 1);
j--;
}
}
else if (intervals[i][1] <= e[j] && intervals[i][1] >= s[j]) {
if (f == 0) {
s.splice(j, 1, Math.min(intervals[i][0], s[j]));
index = j;
f = 1;
} else {
e.splice(index, 1,e[j]);
s.splice(j, 1);
e.splice(j, 1);
j--
}
}
}
if (f == 0) {
s.push(intervals[i][0]);
e.push(intervals[i][1]);
}
}
let re = []
for (var i = 0; i < s.length; i++) {
re.push([s[i], e[i]]);
}
return re;
};