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.

自己的代码:

ac没有通过,就因为一个很关键的,没有想到要先对list排序

public static List<Interval> merge(List<Interval> intervals) {
	List<Interval> resultList = new ArrayList<Interval>();
	if(intervals == null) return null;
	if(intervals.size() == 0) return resultList;
	
	int start = Integer.MIN_VALUE; int end = Integer.MIN_VALUE;
	
	for(int i=1,j=0;i<=intervals.size();i++) {
		end = i<intervals.size() ? intervals.get(i-1).end : intervals.get(i-1).start;
		start = i<intervals.size() ? intervals.get(i).start :intervals.get(i-1).end;
		
		while(end >= start && i<=intervals.size()) {
			i++;
			end = i<intervals.size() ? intervals.get(i-1).end : intervals.get(i-1).start;
			start = i<intervals.size() ? intervals.get(i).start :intervals.get(i-1).end;
		}
		
		resultList.add(new Interval(intervals.get(j).start,intervals.get(i-1).end) );
		j = i;
	}
	
	return resultList;
}

别人的代码

Runtime: 11 ms, faster than 91.53% of Java online submissions for Merge Intervals.

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

class Solution {
    public List<Interval> merge(List<Interval> intervals) {
        if(intervals == null || intervals.size() <2)
            return intervals;
        List<Interval> result = new ArrayList<Interval>();
        Collections.sort(intervals, new Comparator<Interval>(){
            public int compare(Interval i1, Interval i2){
                return i1.start == i2.start ? i1.end - i2.end  : i1.start-i2.start;
            }
        });
        Interval temp = intervals.get(0);
        for(int i=1; i<intervals.size();i++){
            Interval newI = intervals.get(i);
            if(newI.start<=temp.end){
                temp.start = Math.min(newI.start, temp.start);
                temp.end = Math.max(newI.end, temp.end);
            } else{
                result.add(temp);
                temp = newI;
            }
            
        }
        result.add(temp);
        
        return result;
    }
}

小结:

1)主要是Comparator的使用方法

2)Collections.sort(list,Comparator)的方式来对list排序

3)排序完成后的,前后相邻两个区间,只有这样三种情况:

     

将上面的Comparator排序的部分换成:

intervals.sort((i1, i2) -> Integer.compare(i1.start, i2.start));

程序依然能ac,但是:

Runtime: 45 ms, faster than 38.01% of Java online submissions for Merge Intervals.

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

Python:

# Definition for an interval.
class Interval:
    def __init__(self, s=0, e=0):
        self.start = s
        self.end = e

class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[Interval]
        :rtype: List[Interval]
        """
        if len(intervals) == 0: 
            return []
        intervals = sorted(intervals, key = lambda x: x.start)
        
        res = [intervals[0]]
        for n in intervals[1:]:
            if n.start <= res[-1].end: 
                res[-1].end = max(n.end, res[-1].end)
            else: 
                res.append(n)
        return res
        

1)sorted(intervals, key = lambda x: x.start),key用来指定按照那个字段来排序

      x此时就可以看做intervals中的一个元素,而x.start就是x中元素的start字段

      这里就表示,对intervals这个列表,按照列表元素的start字段进行排序

      ps:如果列表中start字段相同的两个元素,在排序时,就会维持原样不发生位置变化;

2)res[-1]:取列表最后一个元素的小技巧

3)因为已经按照start排过序了,所以相邻两个区间只有这三种情况

      

测试:

        
if __name__ == "__main__":
    print("---------")
    
    a1 = Interval(1,3)
    a2 = Interval(2,6)
    a3 = Interval(8,10)
    a4 = Interval(15,18)
    
    intervals = [a1,a2,a3,a4]

    s = Solution()
    
    resultList = s.merge(intervals)
    
    for li in resultList:
        print(li.start,li.end)
    
    print("---------++")

猜你喜欢

转载自blog.csdn.net/iNiBuBian/article/details/88430214