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

版权声明:此文章为许诗宇所写,如需转载,请写下转载文章的地址 https://blog.csdn.net/xushiyu1996818/article/details/86071164

题目

合并区间

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

示例 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<Interval> merge(List<Interval> intervals) {
    	int length=intervals.size();
    	if(length<=1){
    		return intervals;
    	}
    	
    	Collections.sort(intervals, new Comparator<Interval>() {
        	public int compare(Interval interval1, Interval interval2) {
        		return interval1.start-interval2.start;
        	}
        });
    	
    	List<Interval> result=new ArrayList<>();
    	result.add(intervals.get(0));
    	int size=1;
    	for(int i=1;i<length;i++){
    		Interval now=intervals.get(i);
    		Interval prev=result.get(size-1);
    		//两者隔离
    		if(now.start>prev.end){
    			result.add(new Interval(now.start, now.end));
    			size++;
    			continue;
    		}
    		//两者融合,上一个的end变为两个end中的max
    		prev.end=Math.max(prev.end, now.end);
    		
    	}
    	   	
    	return result;
    }
}

猜你喜欢

转载自blog.csdn.net/xushiyu1996818/article/details/86071164
今日推荐