leetcode-56-合并区间(merge intervals)-java

题目

合并区间

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

示例 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] 可被视为重叠区间。

 

此题不给出测试用例,直接用leetcode测试

 

解法1(成功,17ms,极快)

两个区间若能合并,则第一个区间的右端点一定不小于第二个区间的左端点。

先将intervals进行排序,将interval的start进行排序,保证list中的start从小到大,然后建立一个list的result,先塞入第一个intervals的东西
然后将intervals从1到length-1进行循环,每次比较now和result里的最后一个prev,
如果now.start>prev.end,说明两个interval不重叠,result里加入一个和now一样的,size++,
如果不一样,说明有重合,满足合并条件,则记录新合并区间的右端点,将prev的end改为两者中最大的那个即可

package pid056;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Definition for an interval.
 * public class Interval {
 *     int start;
 *     int end;
 *     Interval() { start = 0; end = 0; }
 *     Interval(int s, int e) { start = s; end = e; }
 * }
 */
class Solution {
    public List merge(List intervals) {
    	int length=intervals.size();
    	if(length<=1){
    		return intervals;
    	}
    	
    	Collections.sort(intervals, new Comparator() {
        	public int compare(Interval interval1, Interval interval2) {
        		return interval1.start-interval2.start;
        	}
        });
    	
    	List result=new ArrayList<>();
    	result.add(intervals.get(0));
    	int size=1;
    	for(int i=1;iprev.end){
    			result.add(new Interval(now.start, now.end));
    			size++;
    			continue;
    		}
    		//两者融合,上一个的end变为两个end中的max
    		prev.end=Math.max(prev.end, now.end);
    		
    	}
    	   	
    	return result;
    }
}

解法2(成功,10s,很快)

还是一样,先对第一个数字进行排序,然后不断融合,注意边界是融合的波段的第二个数字的max,而不是被融合的最后一个波段

    public int[][] merge(int[][] intervals) {
    	int length=intervals.length;
    	if(length==0){
    		return intervals;
    	}
    	Arrays.sort(intervals, new Comparator() {
			@Override
			public int compare(int[] arg0, int[] arg1) {
				return arg0[0]-arg1[0];
			}   		
		});
    	List list=new ArrayList<>();
    	int i=0;
    	while(i=intervals[i+1][0]){
    			// 如果能吞并,则i++,直到波段i不能吞并波段i+1
    			if(max

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(算法-排序,leetcode-中等,leetcode)