• LeetCode-56. Merge Intervals


    一、问题描述

    给定一系列区间,要求将其中重叠的、临接的区间合并成一个区间

    例子:

    给定[1,3],[2,6],[8,10],[15,18]

    输出[1,6],[8,10],[15,18]

    二、问题解决

    第一步:先对区间按区间头进行排序

    第二步:从第一个区间开始遍历,如果后一个区间与前一个区间有重叠或是紧挨着,则合并,并且继续往后读。如果没有,则将该区间加入result中,并且以下一个区间为起始区间重复这一步。

    //表示区间的结构
    struct Interval {
        int start;
        int end;
        Interval() : start(0), end(0) {}
        Interval(int s, int e) : start(s), end(e) {}
    };
    //排序函数
    void mysort(vector<Interval>& intervals) {
        for (int i = 0; i < intervals.size(); i++) {
            int pos = i;
            while (pos < intervals.size()) {
                if (intervals[pos].start < intervals[i].start)
                    swap(intervals[pos], intervals[i]);
                pos++;
            }
        }
    }
    vector<Interval> merge(vector<Interval>& intervals) {
        vector<Interval> result;
        if (intervals.size() == 0) return result;
        mysort(intervals);
        int pos = 0;
        while (pos < intervals.size()) {
            Interval temp(intervals[pos].start,intervals[pos].end);
            while (++pos < intervals.size() && intervals[pos].start <= temp.end)
                temp.end = max(intervals[pos].end,temp.end);
            result.emplace_back(temp);
        }
        return result;
    }
    
    //这是测试用例
    int main()
    {
        vector<Interval> v = {Interval(1,4),Interval(0,4)};
        auto result = merge(v);
        for (auto i : result) {
            cout << i.start;
            cout << i.end;
            cout << endl;
        }
    
        system("pause");
        return 0;
    }
  • 相关阅读:
    给年轻人的最好忠告--读书笔记
    设计模式之原型模式(Prototype)
    设计模式之建造者模式(Builder)
    简单工厂模式
    Java并发编程:volatile关键字解析
    深入Java单例模式
    单例模式
    收音代码分析
    蓝牙核心技术概述(一):蓝牙概述
    UART接口
  • 原文地址:https://www.cnblogs.com/likaiming/p/8514724.html
Copyright © 2020-2023  润新知