【题目】合并区间

举报
谙忆 发表于 2021/05/28 05:44:04 2021/05/28
1.4k+ 0 0
【摘要】 原文地址:【题目】合并区间 题目名称 合并区间 题目地址 https://leetcode-cn.com/problems/merge-intervals/ 题目描述 给出一个区间的集合,请合并所有重叠的区间。 示例 1: 输入: [[1,3],[2,6],[8,10],[15,18]] 输出: [[1,6],[8,10],[15,18]] 解释: 区间...

原文地址:【题目】合并区间

题目名称

合并区间

题目地址

https://leetcode-cn.com/problems/merge-intervals/

题目描述

给出一个区间的集合,请合并所有重叠的区间。

示例 1:

输入: [[1,3],[2,6],[8,10],[15,18]]
输出: [[1,6],[8,10],[15,18]]
解释: 区间 [1,3][2,6] 重叠, 将它们合并为 [1,6].

  
 

示例 2:

输入: [[1,4],[4,5]]
输出: [[1,5]]
解释: 区间 [1,4][4,5] 可被视为重叠区间。

  
 

解题源码

方法一

先排序,后遍历

源码

public class Topic56_1 { public static void main(String[] args) { int[][] a = new int[4][2]; a[0][0] = 1; a[0][1] = 3; a[1][0] = 2; a[1][1] = 6; a[2][0] = 5; a[2][1] = 10; a[3][0] = 15; a[3][1] = 18; int[][] b = merge(a); for (int i=0;i<b.length;i++){ System.out.println(b[i][0]+","+b[i][1]); } } public static int[][] merge(int[][] intervals) { //先将intervals进行排序,按照第一列的顺序 quickSort(intervals);

// for (int i=0;i<intervals.length;i++){
// System.out.println(intervals[i][0]+","+intervals[i][1]);
// } int[][] b = new int[intervals.length][2]; int bIndex = 0; for (int i=0;i<intervals.length;i++){ int left = intervals[i][0]; int right = intervals[i][1]; // i不能到最后一行,所以要小于(数组的长度 - 1) // 判断所在行的right和下一行的left大小,对right重新进行赋最大值,之后再不断进行while循环判断 while (i < intervals.length - 1 && right >= intervals[i + 1][0]) { i++; right = Math.max(right, intervals[i][1]); } b[bIndex][0] = left; b[bIndex][1] = right; bIndex++; } int[][] rb = new int[bIndex][2]; //截断b数组 System.arraycopy(b, 0, rb, 0,bIndex); return rb; } public static void quickSort(int[][] arr){ quickSort(arr, 0, arr.length-1); } private static int partition(int[][] arr, int left, int right) { int temp = arr[left][0]; int temp1 = arr[left][1]; while (right > left) { // 先判断基准数和后面的数依次比较 while (temp <= arr[right][0] && left < right) { --right; } // 基准数大于了 arr[right] if (left < right) { temp(arr, right, arr[left]); ++left; } //  基准数大于了 arr[left] while (temp >= arr[left][0] && left < right) { ++left; } if (left < right) { temp(arr, left, arr[right]); --right; } } arr[left][0] = temp; arr[left][1] = temp1; return left; } private static void temp(int[][] arr, int left, int[] ints) { int tempA = ints[0]; int tempB = ints[1]; ints[0] = arr[left][0]; ints[1] = arr[left][1]; arr[left][0] = tempA; arr[left][1] = tempB; } private static void quickSort(int[][] arr, int left, int right) { if (arr == null || left >= right || arr.length <= 1) { return; } int mid = partition(arr, left, right); quickSort(arr, left, mid); quickSort(arr, mid + 1, right); }

}
  
 

消耗

9 ms 41.3 MB

方法二

直接遍历

源码


public class Topic56_2 { public static void main(String[] args) { int[][] a = new int[3][2]; a[0][0] = 1; a[0][1] = 4; a[1][0] = 0; a[1][1] = 2; a[2][0] = 3; a[2][1] = 5; int[][] b = merge(a); for (int i=0;i<b.length;i++){ System.out.println(b[i][0]+","+b[i][1]); } } public static int[][] merge(int[][] intervals) { int len = intervals.length; for (int i=0;i<len-1;i++){ if(intervals[i]==null){ continue; } int min = intervals[i][0]; int max = intervals[i][1]; for(int j=i+1;j<len;j++){ if(intervals[j]==null){ continue; } int a = intervals[j][0]; int b = intervals[j][1]; if( (a>=min && a<=max) || (b>=min && b<=max) || (min<=b && min>=a) || (max<=b && max>=a)  ){ intervals[j][0] = Math.min(min,a); intervals[j][1] = Math.max(max,b); intervals[i]=null; } } } int[][] rb = new int[len][2]; int ind = 0; for (int[] interval : intervals) { if (interval != null) { rb[ind] = interval; ind++; } } int[][] real = new int[ind][2]; System.arraycopy(rb,0,real,0,ind); return real; }
}
  
 

消耗

206 ms 42.8 MB

方法还有很多,上面的也不是最优解。上面仅是我的两种解题源码,仅供参考

吾非大神,与汝俱进

文章来源: chenhx.blog.csdn.net,作者:谙忆,版权归原作者所有,如需转载,请联系作者。

原文链接:chenhx.blog.csdn.net/article/details/101062025

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。