From MergeIntervals to list and vector iterator

这个是之前做过的题目,但是再做发现还是要花很多时间,花时间的原因:

  1. 忘记是start 还是end排序,然后想再证明发现不会了,猜了end,结果挂了
  2. 若不单独考察链表操作时用list,但是list的bidirectional的iterator爆难用,由于不能随机访问,所以iterator只能++ — 不能+1 -1, ++之后还会修改iterator值,要特别当心,
    另外vector和list的 插入 insert 删除 erase 都只能用iterator,所以即使vector要插入删除也要用迭代器遍历,vector删除不需要记录下返回的迭代器,因为内存是连续的,
    直接迭代器加1都可以的,但是list可能就不行了,因为删除了*it, it就回不到链表上了,erase返回的iterator是删除之后的第一个元素的指针,所以for的时候++ 要特别当心不要移动过了,
    如果— 然后再中和掉for的++ 有风险,如果一开始指向begin可能就会越界了,所以最好是for不写++ 这个分支也不— 而在另一个分支++
  3. 一开始觉得vector删除会大量移动元素,估计比list慢,但是不确定慢多少,后来测试确实TLE了,估算下,移动元素上限是n-2+…+1, O(n^2),linklist利用链表删除高效,每次操作都是O(1),总复杂度O(n)。
  4. sort内嵌的comp函数再次忘记写成静态成员函数,今天想通了似乎,写的每个solution class里的函数都是成员函数,实际都是
    solution的instance来调用的,而sort内嵌的comp函数则不允许这样的类型,所以写成静态成员函数,是整个class一份的成员函数。同时comp函数还没有仔细
    考虑多种case,如果start相同的怎么办,这个也是需要处理的,不然可能是出现start相同,结果end大的再前面,这样merge可能会有问题。
  5. 分析interval merge 情况的时候比较慢,主要就是三类情况,关键是怎么设计if else 嵌套来分类

第一次写的自己控制linklist的mergeintervals,还比较青涩o(╯□╰)o:

struct Node
{  
    Interval interval;
    Node* next;
};
class Solution {
public:

static bool SortComp(const Interval& T1, const Interval&T2)
{
    return T1.start<T2.start;
}
Node* CreateLinkList(vector<Interval> data)  
{  
    Node* head=NULL;  
    head=new Node();  
    head->interval=data[0];  
    head->next=NULL;  
    Node* rail=head,*p;// record each rail  
    for(int i=1;i<data.size();i++)  
    {  
        p=new Node();  
        p->interval=data[i];  
        p->next=NULL;  
        rail->next=p;  
        rail=rail->next;  
    }  
    return head;  
}
bool ShouldMerge(Interval n1,Interval n2, Interval& mergedn)
{
    if(n1.start<=n2.start&&n2.start<=n1.end&&n1.end<=n2.end)//intersect
    {
        mergedn.start=n1.start;
        mergedn.end=n2.end;
        return true;
    }
    if(n1.start<=n2.start&&n2.end<=n1.end)//subset of another
    {
        mergedn.start=n1.start;
        mergedn.end=n1.end;
        return true;
    }
    return false;
}
vector<Interval> merge(vector<Interval> &intervals)
{
    if(intervals.size()<=1) return intervals;
    sort(intervals.begin(),intervals.end(),SortComp);//start sort descending, for vector pop_back
    Node* head=CreateLinkList(intervals);

    //merge interval with linklist
    Node* p=head;
    while(p->next!=NULL)//at least two node initially
    {
        Interval mergedn;
        if(  ShouldMerge(p->interval,p->next->interval,mergedn) ||    ShouldMerge(p->next->interval,p->interval,mergedn)   )
        {
            //delete p, p->next;
            //insert mergedn;
            p->interval=mergedn;
            p->next=p->next->next;
        }
        else
            p=p->next;
    }


    /*
    for(int i=0;i<intervals.size()-1;i++)
    {
        Interval mergedn;
        if(ShouldMerge(intervals.at(i),intervals.at(i+1),mergedn)|| ShouldMerge(intervals.at(i+1),intervals.at(i),mergedn))
        {
            intervals.erase(intervals.begin()+i);
            intervals.at(i)=mergedn;
            //intervals.erase(intervals.begin()+i);
            //intervals.insert(intervals.begin()+i,mergedn);
            i--;
        }
        else 
            ;
    }*/

    //copy linklist to vector

    p=head;
    intervals.clear();
    while(p!=NULL)
    {
        intervals.push_back(p->interval);
        p=p->next;
    }

    return intervals;
}
};

基于vector的mergeinterval:

    static bool IntComp(Interval i1,Interval i2)//end ascending
    {
        if(i1.start<i2.start)
            return true;
        else if(i1.start>i2.start)
            return false;
        else
        {
            if(i1.end<i2.end)
                return true;
            else
                return false;
        }
    }
    bool MergeInterval(Interval i1, Interval i2, Interval& newi)
    {
        if(i1.end < i2.start)
            return false;
        else if(i1.end<=i2.end){
            newi.start=i1.start;newi.end=i2.end;return true;}
        else if(i1.end>i2.end)
        {
            newi.start=i1.start;
            newi.end=i1.end;
            return true;
        }
    }


    vector<Interval> merge(vector<Interval> &intervals)
    {
        sort(intervals.begin(),intervals.end(),IntComp);

        list<Interval> lis;
        for(int i=0;i<intervals.size();i++)
            lis.push_back(intervals[i]);
        for(list<Interval>::iterator it=lis.begin();it!=lis.end();)
        {
            Interval i1,i2,newi;
            i1=*it;
            it++;
            if(it==lis.end()) break;
            i2=*it;
            if(MergeInterval(i1,i2,newi))
            {
                *it=newi;
                it--;
                it=lis.erase(it);
            }
        }
        intervals.clear();
        //int i=0;
        for(list<Interval>::iterator it=lis.begin();it!=lis.end();it++)
            intervals.push_back(*it);
        return intervals;
    }

基于list的mergeintervals(IntComp,MergeInterval函数同vector的):

vector<Interval> merge(vector<Interval> &intervals)
{
    sort(intervals.begin(),intervals.end(),IntComp);

    list<Interval> lis;
    for(int i=0;i<intervals.size();i++)
        lis.push_back(intervals[i]);
    for(list<Interval>::iterator it=lis.begin();it!=lis.end();)
    {
        Interval i1,i2,newi;
        i1=*it;
        it++;
        if(it==lis.end()) break;
        i2=*it;
        if(MergeInterval(i1,i2,newi))
        {
            *it=newi;
            it--;
            it=lis.erase(it);
        }
    }
    intervals.clear();
    //int i=0;
    for(list<Interval>::iterator it=lis.begin();it!=lis.end();it++)
        intervals.push_back(*it);
    return intervals;
}

附上之前的解题报告 http://blog.csdn.net/richardzrc/article/details/31454199

学到一个阿三的短语,get a life, 享受生活

Posted by richard爱闹 - 7月 26 2014
如需转载,请注明: 本文来自 Richard