zoukankan      html  css  js  c++  java
  • [leetcode]Merge Intervals

    整体不难,一开始以为是线段树,后来仔细看来不需要,从左到右扫,判断是否要merge就是了。此题有几个要注意的地方:1.Java的Comparator要会写;2.循环结束后的ans.add(tmp)不要忘记;3.merge的时候,左右边界要计算一下。

    /**
     * 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; }
     * }
     */
    public class Solution {
        public ArrayList<Interval> merge(ArrayList<Interval> intervals) {
            // Start typing your Java solution below
            // DO NOT write main() function              
            int len = intervals.size();
            if (len == 0 || len == 1) return intervals;
            ArrayList<Interval> ans = new ArrayList<Interval>();
            
            Collections.sort(intervals, new IntervalComparator());
            
            Interval tmp = intervals.get(0);
            for (int i = 1; i < len; i++) {
                Interval itv = intervals.get(i);
                if (tmp.end >= itv.start) { // mergeable
                    int left = Math.min(tmp.start, itv.start);
                    int right = Math.max(tmp.end, itv.end);
                    tmp = new Interval(left, right);
                }
                else {
                    ans.add(tmp);
                    tmp = intervals.get(i);
                }
            }
            ans.add(tmp);
            return ans;
        }
    }
    
    class IntervalComparator implements Comparator<Interval>
    {
        public int compare(Interval a, Interval b) {
            return a.start - b.start;
        }
    }
    

    第二刷:

    bool cmp(const Interval &a, const Interval &b)
    {
        if (a.start != b.start)
            return a.start < b.start;
        else
            return a.end < b.end;
    }
    
    class Solution {
    public:
        vector<Interval> merge(vector<Interval> &intervals) {
            vector<Interval> result;
            sort(intervals.begin(),intervals.end(), cmp);
            for (int i = 0; i < intervals.size(); i++)
            {
                if (result.size() == 0 || result.back().end < intervals[i].start)
                {
                    result.push_back(intervals[i]);
                }
                else if (intervals[i].end > result.back().end)
                {
                    result.back().end = intervals[i].end;
                }
            }
            return result;
        }
    };
    

    python3,另一种做法是排序各个点

    class Solution:
        def merge(self, intervals: List[List[int]]) -> List[List[int]]:
            points = []
            for interval in intervals:
                points.append((interval[0], -1))
                points.append((interval[1], 1))
                
            points = sorted(points)
            
            result = []
            cnt = 0
            begin = 0
            end = 0
            for point in points:
                cnt += point[1]
                if cnt == -1 and point[1] == -1: # begin
                    begin = point[0]
                if cnt == 0 and point[1] == 1: # end
                    end = point[0]
                    result.append([begin, end])
                    
            return result
    

      

  • 相关阅读:
    Html5 Canvas一个简单的画笔例子
    DrawTool画笔之图形笔
    DrawTool画笔之纹理笔
    DrawTool多重笔之前奏 => 通过InkAnalyzer实现图形识别
    分布式系统阅读清单
    多点触摸画板(MultiTouchCanvas)
    基于 abp vNext 微服务开发的敏捷应用构建平台
    基于 abp vNext 微服务开发的敏捷应用构建平台
    基于 abp vNext 微服务开发的敏捷应用构建平台
    基于 abp vNext 微服务开发的敏捷应用构建平台
  • 原文地址:https://www.cnblogs.com/lautsie/p/3254191.html
Copyright © 2011-2022 走看看