leecode56 合并区间
我的思路
题目分析:
- 需要遍历所有的区间数据,我们需要对区间数据进行排序,将这个区间调整为开头元素递增的顺序。
- 然后不断遍历这个排序后的数组,不断更新新区间即可。
答题思路:
- 先排序
- 遍历排序后的每一个数组元素,然后在这个循环中遍历这个数组后续的元素,比较大小
- 更新数组
最开始的时候,我是利用这个List获取新的数组,最后将这个list转化为二维数组,但是这种方法涉及到多次的装箱和拆箱工作,且占用额外的空间
public int[][] merge(int[][] intervals) {//对数组进行排序Arrays.sort(intervals, (o1, o2) ->o1[0]-o2[0]);//遍历数组进行调整List<List<Integer>> list = new ArrayList<>();for(int i = 0;i<intervals.length;i++){int start = intervals[i][0];int end = intervals[i][1];int j =0;for( j= i+1;j<intervals.length;j++){if(intervals[j][0]<=end){end = Math.max(intervals[j][1],end);//更新这个结束}else{break;//直接结束即可}}List<Integer> ans = new ArrayList<>();ans.add(start);ans.add(end);list.add(ans);i = j-1;}int[][] res = list.stream().map(l -> l.stream().mapToInt(Integer::intValue).toArray()).toArray(int[][]::new);return res;
}
后续我发现可以不用新建集合,直接在原有数组上进行操作即可。
public int[][] merge(int[][] intervals) {//对数组进行排序Arrays.sort(intervals, (o1, o2) ->o1[0]-o2[0]);//遍历数组进行调整int write =0;for(int i = 0;i<intervals.length;i++){int start = intervals[i][0];int end = intervals[i][1];int j =0;for( j= i+1;j<intervals.length;j++){if(intervals[j][0]<=end){end = Math.max(intervals[j][1],end);//更新这个结束}else{break;//直接结束即可}}intervals[write][0]=start;intervals[write][1]=end;write++;i = j-1;}return Arrays.copyOf(intervals, write);
}
灵神思路
灵神的思路和我大体一致,有几点不同。
他是利用这个List<int[]> ans = new ArrayList<>();
来存储结果,并利用ans.toArray(new int[ans.size()][]);
转换为二维数组。
他利用的是ans.get(m-1)[1]来获取的这个上一个区间的右端点,我是直接遍历的。
class Solution {public int[][] merge(int[][] intervals) {Arrays.sort(intervals, (p, q) -> p[0] - q[0]); // 按照左端点从小到大排序List<int[]> ans = new ArrayList<>();for (int[] p : intervals) {int m = ans.size();if (m > 0 && p[0] <= ans.get(m - 1)[1]) { // 可以合并ans.get(m - 1)[1] = Math.max(ans.get(m - 1)[1], p[1]); // 更新右端点最大值} else { // 不相交,无法合并ans.add(p); // 新的合并区间}}return ans.toArray(new int[ans.size()][]);}
}作者:灵茶山艾府
链接:https://leetcode.cn/problems/merge-intervals/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。