数据结构–合并区间
分析
首先需要对整个二维数组的每一个区间的第一列(左端)进行升序,然后因为合并之后的的区间个数不确定,所以使用ArrayList,然后创建一个临时变量为第一个区间,然后比较其第二列(右端)是否与下一个区间的左端相交(注意,这里是大于等于),如果相交,就比较他们右端点的大小,把大的赋给临时变量,如果不相交,就往集合添加这个区间,然后让临时变量为当前没有相交到的数组
代码实例
第一个:(我最开始的土方法,看看就行)
class Solution {public int[][] merge(int[][] intervals) {if(intervals.length == 0){return intervals;}for(int j = 0 ;j < intervals.length - 1;j++){for(int i = 0;i < intervals.length - 1 - j;i++){int [] temp = new int[2]; if(intervals[i][0] > intervals[i + 1][0]) {temp = intervals[i];intervals[i] = intervals[i + 1];intervals[i + 1] = temp;}}}// 完成排序List<int []> list = new ArrayList<>();int [] temp = intervals[0];for(int i = 1; i < intervals.length;i++){if(temp[1] >= intervals[i][0]){temp[1] =Math.max(temp[1],intervals[i][1]);}else{list.add(temp);temp = intervals[i];}}list.add(temp);return list.toArray(new int[list.size()][2]);}
}
标准的:
class Solution {public int[][] merge(int[][] intervals) {
if (intervals.length == 0) return intervals;//1、对二维数组按照第一列升序排序Arrays.sort(intervals, (a, b) -> a[0] - b[0]);//2、进行合并数组List<int []> list = new ArrayList<>();int term[] =intervals[0];//临时空间,1 判断是否需要合并集合,2 是否放入结果集for (int i = 1; i < intervals.length; i++) {if (term[1]>=intervals[i][0]){term[1]=Math.max(term[1],intervals[i][1]);}else {list.add(term);term=intervals[i];}}list.add(term);return list.toArray(new int[list.size()][2]);}
}
力扣的示例代码:
class Solution {public int[][] merge(int[][] intervals) {int max = Integer.MIN_VALUE;int min = Integer.MAX_VALUE;for (int[] ints : intervals) {max = Math.max(ints[1],max);min = Math.min(ints[0],min);}// min + index = ints[0]// map数组存储的是 每个区间的起点 对应的最大的终点int[] map = new int[max - min + 1];Arrays.fill(map, -1);// 区间起始值相同,则取最大右区间for (int[] ints : intervals) {int left = ints[0] - min;map[left] = Math.max(map[left], ints[1]);}//开始正常处理LinkedList<int []> res = new LinkedList<>();for (int i = 0; i < map.length; i++) {if (map[i] == -1) {continue;}int left = i + min;int right= map[i];if (res.size() == 0 || left > res.getLast()[1]) {//当前区间的起始点,大于上一个区间的终止点,需要开辟一个新的区间res.add(new int[]{left,right});}else{if (res.getLast()[1] < right) {//当前区间的终止点 大于 上一个区间的终止点,则要更新区间的终止点res.getLast()[1] = right;}}}return res.toArray(new int[][]{});}
}
复杂度分析
时间复杂度:
O(nlogn),其中 n 为区间的数量。除去排序的开销,我们只需要一次线性扫描,所以主要的时间开销是排序的 O(nlogn)。
空间复杂度:
O(logn),其中
n 为区间的数量。这里计算的是存储答案之外,使用的额外空间。
O(logn) 即为排序所需要的空间复杂度。