合并区间

来源:互联网 发布:js点击事件隐藏 编辑:程序博客网 时间:2024/06/04 23:27

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

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


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

解题思路:合并若干个区间,就是要比较其区间端点值的大小。初始的合并区间就是给出的第一个区间。若区间的左端点的值小于合并以后区间的左端点值且区间的右端点值大于合并以后区间的右端点值,即区间包含了合并以后,则合并以后的区间为第一个区间。如果区间的右端点值小于合并以后的区间的左端点值,则不能进行区间合并。根据以上原则可以写出具体的实现代码。

实现代码:

/**
 * Definition of Interval:
 * classs Interval {
 *     int start, end;
 *     Interval(int start, int end) {
 *         this->start = start;
 *         this->end = end;
 *     }
 */
 #include <algorithm>
 
 using std::sort;
 
 bool cmp(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
         int i,j;
        vector<Interval> res;
         if(intervals.empty())         {            
             return res;
         }
        sort(intervals.begin(),intervals.end(),cmp);
       
        res.push_back(intervals[0]);
        
        bool join;
        for(i = 1; i < intervals.size(); ++ i)
        {            join = false;
            for(j = 0; j < res.size(); ++ j)
            {
                if(intervals[i].start <= res[j].end && intervals[i].end >= res[j].end)
                {
                    res[j].end = intervals[i].end;
                    join = true;
                    break;
                }
                     if(intervals[i].end <= res[j].end)                {
                    join = true;
                    break;
                }
            }
            
           if(!join)
            {
                res.push_back(intervals[i]);
           }      }
       
       return res;
    }
};

做题感想:要抓住问题的关键。在每次合并区间之后不要忘记跟新join的值。进一步体会对多个vector进行排序的sort函数应用。

原创粉丝点击