leetcode 56.Merge Intervals

一 题目

Given a collection of intervals, merge all overlapping intervals.

Example 1:

Input: [[1,3],[2,6],[8,10],[15,18]]
Output: [[1,6],[8,10],[15,18]]
Explanation: Since intervals [1,3] and [2,6] overlaps, merge them into [1,6].

Example 2:

Input: [[1,4],[4,5]]
Output: [[1,5]]
Explanation: Intervals [1,4] and [4,5] are considered overlapping.

NOTE: input types have been changed on April 15, 2019. Please reset to default code definition to get new method signature.

二 分析

   medium 级别,求数组里面重合的区间,合并为一个。

这个题目挺啰嗦的,我一开始就犯错就掉坑了,遍历数组的时候前后各种判断。后来想了想,得先排序,这样就不用这么复杂了。 排序就是按照intervals【0】,需要自定义Comparator。先把第一个区间作为参照,然后从第二个开始遍历区间集,如果结果中最后一个区间和遍历的当前区间无重叠,直接将当前区间存入结果中,如果有重叠,将结果中最后一个区间的 end 值更新为结果中最后一个区间的 end 和当前 end 值之中的较大值,然后继续遍历区间集。

public static void main(String[] args) {
		int[][] intervals1 ={
				{1,4},{0,4}
		};
		int[][] res1 = merge(intervals1);
		System.out.println(JSON.toJSON( res1));
		
		int[][] intervals2 ={
				{1,4},{4,5}
		};
		int[][] res2 = merge(intervals2);
		System.out.println(JSON.toJSON( res2));
		
		int[][] intervals ={
				{1,3},{2,6},{8,10},{15,18}
		};
		int[][] res = merge(intervals);
		System.out.println(JSON.toJSON( res));
	}
	
	
	public static int[][] merge(int[][] intervals) {
		//conner case
		if(intervals.length <=1){
			return intervals;
		}
		int size = intervals.length;
		//先排序
		Arrays.sort(intervals, new Comparator<int[]>(){

			@Override
			public int compare(int[] o1, int[] o2) {
				// TODO Auto-generated method stub
				return Integer.compare(o1[0],o2[0]);
			}
			
		});
		 int [] current = intervals[0];
		List<int[]> res = new ArrayList<int[]>();
		//遍历
		for(int i=1;i< intervals.length;i++ ){
			//独立的
			if(current[1]< intervals[i][0] ){
				res.add(intervals[i]);
				current = intervals[i];   
			}
			else{		
				current[1] = Math.max(current[1], intervals[i][1]);		
			}			
		}	
		res.add(current);
		
		return   res.toArray(new int[0][0]);        
    }

 

Runtime: 6 ms, faster than 88.51% of Java online submissions for Merge Intervals.

Memory Usage: 38.6 MB, less than 97.83% of Java online submissions for Merge Intervals.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值