首页 > 其他 > 详细

LeetCode—Merge Intervals

时间:2015-03-24 19:20:40      阅读:139      评论:0      收藏:0      [点我收藏+]

Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

题目是很简单的,就是比较两个区间,又融合的就进行融合处理


第一反应就是先对数据进行一个简单的sort排序,然后循环比较就可以了。在实际代码中遇到一个问题就是在cmp函数中

如果将< 改为 <=   会出现超时的情况


/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
 bool cmp(const Interval &val1,const Interval &val2)
    {
        return (val1.start < val2.start);
    }
class Solution {
public:
  vector<Interval> merge(vector<Interval> &intervals) {
        vector<Interval> result;
        result.clear();
        if(intervals.empty())
        {
            return result;
        }
        sort(intervals.begin(),intervals.end(),cmp);
        int length = intervals.size();
        result.push_back(intervals[0]);
        
        for(int i = 1; i < length; i++)
        {
            int n = result.size();
            if((result[n-1].end >= intervals[i].start) && (result[n-1].start <= intervals[i].start))
            {
                result[n-1].end = ((result[n-1].end > intervals[i].end)? result[n-1].end:intervals[i].end);
            }
            else
            {
                result.push_back(intervals[i]);
            }
        }
        return result;
    }
};

上面这种解决方案还是比较直观的,在这之前自己还写了一个比较冗长的,没有直接利用vector中的数据进行比较,而是单独用的mergeVal,

这样会导致一个问题就是在最后一个数据的时候需要自己再单独放入到vector当中

/**
 * Definition for an interval.
 * struct Interval {
 *     int start;
 *     int end;
 *     Interval() : start(0), end(0) {}
 *     Interval(int s, int e) : start(s), end(e) {}
 * };
 */
 bool cmp(const Interval &val1,const Interval &val2)
    {
        return (val1.start < val2.start);
    }
class Solution {
public:
  vector<Interval> merge(vector<Interval> &intervals) {
        vector<Interval> result;
        result.clear();
        if(intervals.empty())
        {
            return result;
        }
        sort(intervals.begin(),intervals.end(),cmp);
        int length = intervals.size();
        Interval mergeVal(0,0);
        mergeVal.start = intervals[0].start;
        mergeVal.end = intervals[0].end;
        if(length == 1)
        {
            result.push_back(mergeVal);
            return result;
        }
        for(int i = 1; i < length; i++)
        {
            if((mergeVal.end >= intervals[i].start) && (mergeVal.start <= intervals[i].start))
            {
                mergeVal.end = ((mergeVal.end > intervals[i].end)? mergeVal.end:intervals[i].end);
            }
            else
            {
                result.push_back(mergeVal);
                mergeVal.start = intervals[i].start;
                mergeVal.end = intervals[i].end;
            }
        }
        result.push_back(mergeVal); //<将最后一个放入
        return result;
    }
};


LeetCode—Merge Intervals

原文:http://blog.csdn.net/xietingcandice/article/details/44595251

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!