[失业前端恶补算法]JavaScript leetcode刷题笔记 56. 合并区间

声明:只求用最简单的方法通过,不求优化,不喜勿喷
我觉得可能是全网最垃圾的写法了,但是我觉得和我一样思路的可能有不少,还是写一下吧,主要是一开始思路不对,后面一点一点补回来,就越写越麻烦了

  1. 刚开始想的是读入每一组数据之后,先判定当前的区域,有如下几种情况
  • 读入数据在当前某个区域内部 —— 不做处理,结束遍历
  • 读入数据包括了当前某个区域 —— 将这个区域更新为当前数据
  • 读入区域右侧在某个区域内 —— 把当前区域开始点更新为读入数据的开始点
  • 读入区域左侧在某个区域内 —— 把当前区域结束点更新为读入数据的结束点
  • 如果没有区域和读入数据相关 —— 把读入数据输入区域内
  1. 然后发现问题在于,如果只更新一次上述逻辑正确,但是如果有多个区域需要处理的话,区域重叠不能处理,所以引入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;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摸鱼老萌新

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值