LeetCode-57题:插入区间(原创)

 题目链接】

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

【解题代码】

class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        List<int[]> intervalList = new ArrayList<>();
        boolean newIntervalInsert = false;
        for (int i = 0; i < intervals.length; i++) {
            if (!newIntervalInsert) {
                int r = intervalCompare(newInterval, intervals[i]);
                if (r == 0) {
                    intervalList.add(newInterval);
                    intervalList.add(intervals[i]);
                    newIntervalInsert = true;
                } else if (r == 4) {
                    intervalList.add(intervals[i]);
                } else {
                    newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
                    newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
                }
            } else {
                intervalList.add(intervals[i]);
            }
        }
        if (!newIntervalInsert) {
            intervalList.add(newInterval);
        }
        int[][] result = new int[intervalList.size()][2];
        for (int i = 0; i < intervalList.size(); i++) {
            result[i] = intervalList.get(i);
        }
        return result;
    }

    private int intervalCompare(int[] interval1, int[] interval2) {
        if (interval1[1] < interval2[0]) return 0;
        if (interval1[0] > interval2[1]) return 4;
        if (interval1[0] <= interval2[0]) {
            return interval1[1] <= interval2[1] ? 1 : 5;
        } else {
            return interval1[1] <= interval2[0] ? 2 : 3;
        }
    }
}

【解题步骤】

  1.  插入区间算法关键是解决两个区间interval1和interval2的位置判断,经过分析可得两个区间位置有以下6种情况:
    1. interval1在interval2左外部,即interval1[1] < interval2[0];
    2. interval1与interval2左相交,即interval1[0] <= interval2[0]&&interval1[1]> interval2[0] interval1[1] <= interval2[1];
    3. interval1被interval2包含,即interval1[0] > interval2[0]&&iinterval1[1] < interval2[1];
    4. interval1与interval2右相交,即interval1[0] > interval2[0]&&interval1[0]< interval2[1] interval1[1] > interval2[1];
    5. interval1在interval2右外部,即interval1[0] > interval2[1];
    6. interval1包含interval2,即interval1[0] < interval2[0]&&iinterval1[1] >interval2[1];
      private int intervalCompare(int[] interval1, int[] interval2) {
              if (interval1[1] < interval2[0]) return 0;
              if (interval1[0] > interval2[1]) return 4;
              if (interval1[0] <= interval2[0]) {
                  return interval1[1] <= interval2[1] ? 1 : 5;
              } else {
                  return interval1[1] <= interval2[0] ? 2 : 3;
              }
          }
  2. 上面6种情况又可以分为三类:
    1. interval1在interval2左外部
    2. interval1与interval2相交
    3. interval1在interval2右外部
  3. 根据上面三种位置分类,newInterval与所有intervals[i]依次分别处理:
    1.  newInterval在intervals[i]左外部:将newInterval和intervals[i]加入结果集,然后将后续所有intervals[i]加入结果集即可;
    2. newInterval与intervals[i]相交:将newInterval与intervals[i]合并,并继续处理后续intervals[i];
    3. newInterval在interval[i]右外部,将interval[i]加入结果集,并继续处理后续intervals[i];
      for (int i = 0; i < intervals.length; i++) {
          if (!newIntervalInsert) {
              int r = intervalCompare(newInterval, intervals[i]);
              if (r == 0) {
                  intervalList.add(newInterval);
                  intervalList.add(intervals[i]);
                  newIntervalInsert = true;
              } else if (r == 4) {
                  intervalList.add(intervals[i]);
              } else {
                  newInterval[0] = Math.min(newInterval[0], intervals[i][0]);
                  newInterval[1] = Math.max(newInterval[1], intervals[i][1]);
              } 
          } else {
              intervalList.add(intervals[i]);
          }
      }
  4. 收尾处理:判断下newInterval是否已经加入结果集,如果还没添加,则添加一下即可
    if (!newIntervalInsert) {
        intervalList.add(newInterval);
    }
    ​​​
  5. 最后将list类型的结果转成数组返回即可
    int[][] result = new int[intervalList.size()][2];
    for (int i = 0; i < intervalList.size(); i++) {
        result[i] = intervalList.get(i);
    }
    return result;

【思路总结】

  1. 逻辑思维,逻辑思维,逻辑思维,重要的事情说三遍,算法处理一定要相关业务逻辑上想清楚;
  2. intervalCompare函数编写时有技巧,先把左右两种外部不相交的情况,然后再处理剩余4中相交的情况,代码就会简洁清晰很多。
  3. LeetCode解题之前,一定不要看题解,看了就“破功”了!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值