LintCode-合并区间

来源:互联网 发布:js点击事件隐藏 编辑:程序博客网 时间:2024/05/20 07:18

题目描述:给出若干闭合区间,合并所有重叠的部分。

样例:

给出的区间列表 => 合并后的区间列表:

[                     [  [1, 3],               [1, 6],  [2, 6],      =>       [8, 10],  [8, 10],              [15, 18]  [15, 18]            ]]

做题思路:先用bool函数规定一种排序算法,每个数组的第一个数字比较,按照升序的方法排列。运用sort函数将intervals的数组按照规定排列,分情况讨论,一共有两种情况,一种是前一个数组的最后一个数字大于等于后一个数组的最后一个数字,那就取前面那个数组,因此在intervals中删除后一个数组;一种是前一个数组的最后一个数字大于等于后一个数组的第一个数字,为了取最大的范围,就需要把后一个数组的end赋给前一个数组的end,然后删掉后一个数组。进行这样的操作,数组中最终留下的就是所有区间的合并区间。

关键代码:

/** * Definition of Interval: * classs Interval { *     int start, end; *     Interval(int start, int end) { *         this->start = start; *         this->end = end; *     } */ bool pailie(const Interval &a, const Interval &b)  { return a.start<b.start;}class Solution {public:    /**     * @param intervals: interval list.     * @return: A new interval list.     */    vector<Interval> merge(vector<Interval> &intervals) {        // write your code here    std::sort(intervals.begin(),intervals.end(),pailie);    int i=1;    while(1)    { if(i>=intervals.size())       break;      if (intervals[i-1].end>=intervals[i].end)       { intervals.erase(intervals.begin()+i);}      else if(intervals[i-1].end>=intervals[i].start)       { intervals[i-1].end=intervals[i].end;        intervals.erase(intervals.begin()+i);}       else i++;    }    return intervals;    }};

做题感想:这一题刚开始想的时候一点思路也没有,同学说需要把区间用sort函数排序。然后就想到了排序之后可以比较,这一题参考网上的答案,刚开始我写的时候在删除那里出现了问题,后来又看了看网上的答案才改正过来。