学习目标:
力扣第57题:插入区间
学习内容:
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)
示例 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] 重叠。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/insert-interval
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
学习时间:
2020年11月4日
学习产出:
/**
* @ClassName: Solution.java
* @Description: 双指针分别找到左边合右边不重合的部分,剩下对重合部分进行处理,
* 重合部分的处理为左边的元素为intervals和newInterval中最小的元素
* 右边的元素为intervals和newInterval中最大的元素
*
* @version: v1.0.0
* @author: 童一
* @date: 2020年11月4日 下午10:25:42
*
* Modification History:
Modification History:
* Date Author Version Description
*----------------------------------------------------------------*
* 2020年11月4日 童梦君 v1.0.0 修改原因
*/
public class Solution {
public int[][] insert(int[][] intervals, int[] newInterval) {
if(intervals.length==0) {
return new int[][] {newInterval};//如果
}
ArrayList<int []> list = new ArrayList<>();
int left = 0;
int right = intervals.length-1;
while(left<intervals.length&&intervals[left][1]<newInterval[0]) {
list.add(intervals[left++]);//左边不重合的添加到集合中
}
while(right>=0&&intervals[right][0]>newInterval[1]) {
list.add(left,intervals[right--]);//右边不重合的
}
//中间重合的部分
int [] arr = new int [2];
//重合部分的左边,
arr[0]=left>=intervals.length?newInterval[0]:Math.min(intervals[left][0],newInterval[0]);
//重合部分的右边
arr[1]=right<0?newInterval[1]:Math.max(intervals[right][1],newInterval[1]);
list.add(left,arr);//加入集合(原来left位置的元素会往后移)
int[][]newarr=new int [list.size()][2];
for(int i =0;i<list.size();i++) {
newarr[i]=list.get(i);
}
return newarr;
}
}