全国中小企业网站,iis wordpress安装教程,门户网站栏目规范化建设,网站建设专家北京注安优质博文#xff1a;IT-BLOG-CN
一、题目
给你一个无重叠的 #xff0c;按照区间起始端点排序的区间列表。在列表中插入一个新的区间#xff0c;你需要确保列表中的区间仍然有序且不重叠#xff08;如果有必要的话#xff0c;可以合并区间#xff09;。
示例 1#x…优质博文IT-BLOG-CN
一、题目
给你一个无重叠的 按照区间起始端点排序的区间列表。在列表中插入一个新的区间你需要确保列表中的区间仍然有序且不重叠如果有必要的话可以合并区间。
示例 1 输入intervals [[1,3],[6,9]], newInterval [2,5] 输出[[1,5],[6,9]]
示例 2 输入intervals [[1,2],[3,5],[6,7],[8,10],[12,16]], newInterval [4,8] 输出[[1,2],[3,10],[12,16]] 解释这是因为新的区间[4,8]与[3,5],[6,7],[8,10]重叠。
示例 3 输入intervals [], newInterval [5,7] 输出[[5,7]]
示例 4 输入intervals [[1,5]], newInterval [2,3] 输出[[1,5]]
示例 5 输入intervals [[1,5]], newInterval [2,7] 输出[[1,7]] 0 intervals.length 104 intervals[i].length 2 0 intervals[i][0] intervals[i][1] 105 intervals根据intervals[i][0]按升序排列 newInterval.length 2 0 newInterval[0] newInterval[1] 105 二、代码
对于区间S1[l1,r1]和S2[l2,r2]]如果它们之间没有重叠没有交集说明要么S1在S2的左侧此时有r1l2要么S1在S2的右侧此时有l1r2。
如果r1l2和l1r2二者均不满足说明S1和S2必定有交集它们的交集即为[max(l1,l2),min(r1,r2)]并集即为[min(l1,l2),max(r1,r2)]
模拟 在给定的区间集合X互不重叠的前提下当我们需要插入一个新的区间S[left,right]时我们只需要 【1】找出所有与区间S重叠的区间集合X′ 【2】将X′中的所有区间连带上区间S合并成一个大区间 【3】最终的答案即为不与X′重叠的区间以及合并后的大区间
这样做的正确性在于给定的区间集合中任意两个区间都是没有交集的因此所有需要合并的区间就是所有与区间S重叠的区间。并且在给定的区间集合已经按照左端点排序的前提下所有与区间S重叠的区间在数组intervals中下标范围是连续的因此我们可以对所有的区间进行一次遍历就可以找到这个连续的下标范围。
当我们遍历到区间[li,ri]时 【1】如果rileft说明[li,ri]与S不重叠并且在其左侧我们可以直接将[li,ri]加入答案 【2】如果liright说明[li,ri]与S不重叠并且在其右侧我们可以直接将[li,ri]加入答案 【3】如果上面两种情况均不满足说明[li,ri]与S重叠我们无需将[li,ri]加入答案。此时我们需要将S与[li,ri]合并即将S更新为其与[li,ri]的并集。
那么我们应当在什么时候将区间S加入答案呢由于我们需要保证答案也是按照左端点排序的因此当我们遇到第一个 满足liright的区间时说明以后遍历到的区间不会与S重叠并且它们左端点一定会大于S的左端点。此时我们就可以将S加入答案。特别地如果不存在这样的区间我们需要在遍历结束后将S加入答案。
class Solution {public int[][] insert(int[][] intervals, int[] newInterval) {int left newInterval[0];int right newInterval[1];boolean placed false;Listint[] ansList new ArrayListint[]();for (int[] interval : intervals) {if (interval[0] right) {// 在插入区间的右侧且无交集if (!placed) {ansList.add(new int[]{left, right});placed true; }ansList.add(interval);} else if (interval[1] left) {// 在插入区间的左侧且无交集ansList.add(interval);} else {// 与插入区间有交集计算它们的并集left Math.min(left, interval[0]);right Math.max(right, interval[1]);}}if (!placed) {ansList.add(new int[]{left, right});}int[][] ans new int[ansList.size()][2];for (int i 0; i ansList.size(); i) {ans[i] ansList.get(i);}return ans;}
}时间复杂度 O(n)其中n是数组intervals的长度即给定的区间个数。 空间复杂度 O(1)。除了存储返回答案的空间以外我们只需要额外的常数空间即可。