[leetCode]57. 插入区间

一次遍历

这题的关键是判断两个区间是否存在交集,比如区间 S 1 [ l 1 , r 1 ] , S 2 [ l 2 , r 2 ] ; 如 果 r 1 < l 2 说 明 S 1 在 S 2 左 侧 无 交 集 , 如 果 l 1 > r 2 则 说 明 S 1 > S 2 则 S 1 在 S 2 右 侧 无 交 集 , 如 果 不 符 合 以 上 两 个 条 件 则 说 明 有 交 集 , S_1[l_1,r_1],S_2[l_2, r_2];如果r_1<l_2说明S_1在S_2左侧无交集,如果l_1>r_2则说明S_1>S_2则S_1在S_2右侧无交集,如果不符合以上两个条件则说明有交集, S1[l1,r1],S2[l2,r2];r1<l2S1S2l1>r2S1>S2S1S2则可以通过 [ m a x ( l 1 , l 2 ) , m i n ( r 1 , r 2 ) ] [max(l_1,l_2),min(r_1,r_2)] [max(l1,l2),min(r1,r2)]求交集,通过 [ m i n ( l 1 , l 2 ) , m a x ( r 1 , r 2 ) ] [min(l_1,l_2),max(r_1,r_2)] [min(l1,l2),max(r1,r2)]求并集。
通过遍历区间数组如果当前区间与新区间S无交集则直接加入答案,如果有交集则与新区间S进行合并,如果第一次遇到在S右侧( l > l e f t l>left l>left)的区间则将S加入答案,然后加入当前区间,遍历完数组后如果不存在这样的区间则需要把S加入答案。

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        // newInterval 区间的左右下标
        int left = newInterval[0];
        int right = newInterval[1];
        // 存放答案的列表
        List<int[]> ans = new ArrayList<>();
        // bool 变量 判断是否加入S
        boolean placed = false;
        // 遍历原来的区间数组
        for (int[] interval : intervals) {
            // 在插入区间右侧无交集
            if (interval[0] > right) {
                // 如果没有加入S
                if (!placed) {
                    ans.add(new int[]{left, right});
                    placed = true;
                }
                ans.add(interval);
            } else if (interval[1] < left) {
                // 在插入区间左侧且无交集
                ans.add(interval);
            } else {
                // 与插入区间有交集 计算并集
                left = Math.min(left, interval[0]);
                right = Math.max(right, interval[1]);
            }
        }
        // 如果不存在这样的区间则将s加入答案
        if (!placed) {
            ans.add(new int[]{left, right});
        }
        int[][] fans = new int[ans.size()][2];
        for (int i = 0; i < ans.size(); i++) {
            fans[i] = ans.get(i);
        }
        return fans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值