57. 插入区间

题目:

思路:

【1】用指针去扫 intervals,最多可能有三个阶段:

1)不重叠的绿区间,在蓝区间的左边
2)有重叠的绿区间
3)不重叠的绿区间,在蓝区间的右边

 

 

代码展示:

//时间1 ms 击败 95.56%
//内存42.8 MB 击败 86.3%
//时间复杂度:O(n),其中 n 是数组 intervals 的长度,即给定的区间个数。
//空间复杂度:O(1)。除了存储返回答案的空间以外,我们只需要额外的常数空间即可。
class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        int[][] ans;
        List<int[]> ansList = new ArrayList<>();
        int i = 0 , n = intervals.length;
        // 将数据分成三部分
        // 第一部分该区间左边不相交部分
        while (i < n && intervals[i][1] < newInterval[0]){
            // 加入后,指针移动右移
            ansList.add(intervals[i++]);
        }
        // 第二部分该区间相交部分,相交部分要进行合并
        while (i < n && intervals[i][0] <= newInterval[1]){
            // 取合并的两区间的两边的边界值
            newInterval[0] = Math.min(newInterval[0],intervals[i][0]);
            newInterval[1] = Math.max(newInterval[1],intervals[i][1]);
            i++;
        }
        // 合并完后放入结果集中
        ansList.add(newInterval);
        // 第三部分该区间右边不相交部分
        while (i < n && intervals[i][0] > newInterval[1]){
            // 加入后,指针移动右移
            ansList.add(intervals[i++]);
        }

        ans = new int[ansList.size()][2];
        for (i = 0; i < ansList.size(); i++) {
            ans[i] = ansList.get(i);
        }
        return ans;
    }
}

//时间0 ms 击败 100%
//内存42.8 MB 击败 86.54%
class Solution {
    public int[][] insert(int[][] intervals, int[] newInterval) {
        int left = newInterval[0], right = newInterval[1];
        boolean flag = false;
        List<int[]> list = new ArrayList<>();
        for (int[] interval : intervals) {
            if (interval[0] > right) {
                if (!flag) {
                    list.add(new int[]{left, right});
                    flag = true;
                }
                list.add(interval);
            } else if (interval[1] < left) {
                list.add(interval);
            } else {
                left = Math.min(left, interval[0]);
                right = Math.max(right, interval[1]);
            }
        }
        if (!flag) {
            list.add(new int[]{left, right});
        }
        int[][] res = new int[list.size()][];
        for (int i = 0; i < list.size(); ++i) {
            res[i] = list.get(i);
        }
        return res;
    }
}

 

posted @ 2023-06-28 16:45  忧愁的chafry  阅读(6)  评论(0编辑  收藏  举报