区间重合判断(编程之美2.19)

来源:互联网 发布:淘宝高仿大牌女包推荐 编辑:程序博客网 时间:2024/05/22 04:05
题目:给定一些无序区间,判断某个给定的特定区间是否在这些无序的区间内。这个题目比较简单,首先将给定的区间排序,在对重合的区间进行排序,使得区间变成递增且不重叠的若干个区间,对于给定的区间在已经处理好的区间内进行二分查找,完成区间覆盖的判断。代码如下:
 
   #include <stdio.h>   #include <vector>   #include <algorithm>   using namespace std;      class Interval {    public:     Interval(int start, int end) : start_(start), end_(end) {}     Interval() :start_(0), end_(0) {}    static bool OrderByStart(const Interval& left, const Interval& right)     {      return left.start_ < right.start_;    }    friend bool operator<(const Interval& left, const Interval& right)     {      return left.start_ < right.start_;    }    int start_;    int end_;  };    void CombinInterval(std::vector<Interval>& orginal, std::vector<Interval>* combined)   {    if (orginal.size() < 1)     {      return;    }    sort(orginal.begin(), orginal.end(), Interval::OrderByStart);//直接使用sort函数进行排序,根据区间的第一个数字大小进行排序        Interval combined_interval = orginal0];    int new_ending = orginal[0].end_;    for (int i = 1; i < orginal.size(); ++i)     {      if (combined_interval.end_ >= orginal[i].start_)       {        new_ending = combined_interval.end_ > orginal[i].end_ ? combined_interval.end_ : orginal[i].end_;        continue;      }      combined_interval.end_ = new_ending;      combined->push_back(combined_interval);            combined_interval = orginal[i];      new_ending = orginal[i].end_;    }    combined_interval.end_ = new_ending;    combined->push_back(combined_interval);  }    bool CoverTest(const Interval& interval, std::vector<Interval>& intervals, Interval* covered_interval)   {    std::vector<Interval> combined_intervals;    CombinInterval(intervals, &combined_intervals);   //对原有的区间进行合并    for (int i = 0; i < combined_intervals.size(); ++i)     {      printf("%d-%d\n", combined_intervals[i].start_, combined_intervals[i].end_);    }        if (combined_intervals.size() < 1)     {      return false;    }    int start = 0;    int end = combined_intervals.size() -1;    int middle = 0;    bool found = false;    while (end >= start)     {      middle = (start + end) / 2;      if (interval < combined_intervals[middle])    //在类中定义了类的<操作      {        end = middle - 1;      }      else if (combined_intervals[middle] < interval)       {        start = middle + 1;      }       else       {        found = true;        break;            }    }    int target_index = found ? middle : start - 1;    printf("target:%d\n", target_index);    if (target_index >= 0 &&        combined_intervals[target_index].start_ <= interval.start_ &&        combined_intervals[target_index].end_  >= interval.end_) {      *covered_interval = combined_intervals[target_index];      return true;    }     else     {      return false;    }  }      int main(int argc, char** argv)   {    std::vector<Interval> intervals;   intervals.push_back(Interval(2,5));   intervals.push_back(Interval(3,4));   intervals.push_back(Interval(4,7));   intervals.push_back(Interval(9,13));   Interval target_interval(3, 4);   Interval covered_interval;  //判断出重合区间   if (CoverTest(target_interval, intervals, &covered_interval))    {     printf("the covered interval is (%d, %d)\n", covered_interval.start_, covered_interval.end_);   }    else    {     printf("uncovered\n");   } return 0; }

	
				
		
原创粉丝点击