[LeetCode]Insert Interval 考虑多种情况

写太复杂了。

思想:确定带插入区间的每一个边界位于给定区间中的哪个位置,共同拥有5种情况

   -1 |(0)_1_(2)|  (3)

当中。0,1,2这三种情况是一样的。


确定每一个带插入区间的两个边界分别属于哪种情况,记为flag0和flag1。

然后依据flag0和flag1的组合情况,分9种情况进行讨论

class Solution {
public:
    vector<Interval> insert(vector<Interval> &its, Interval ni) {
        int i,n=its.size(),j,k;
        int flag0=-1,flag1=-1;
        vector<Interval>ans;
        if(n==0){
            ans.push_back(ni);
            return ans;
        }
        for(i=0;i<n;++i)
			if((i==0||its[i-1].end<ni.start)&&its[i].start>ni.end)
				break;
        if(i<n||(i==n&&its[n-1].end<ni.start)){
            for(k=0;k<i;++k)ans.push_back(its[k]);
            ans.push_back(ni);
            for(;k<n;++k)ans.push_back(its[k]);
            return ans;
        }
        for(i=0;i<n;++i){
			if(its[i].end==ni.start){flag0=2;break;}
			else if(its[i].start==ni.start){flag0=0;break;}
            else if(its[i].start>ni.start)break;
            else if(its[i].start<ni.start&&its[i].end>ni.start){flag0=1;break;}
        }
        if(i==n&&flag0==-1)flag0=3;//no exist
        for(j=i;j<n;++j){
			if(its[j].end==ni.end){flag1=2;break;}
			else if(its[j].start==ni.end){flag1=0;break;}
            else if(its[j].start>ni.end)break;
            else if(its[j].start<ni.end&&its[j].end>ni.end){flag1=1;break;}
        }
        if(j==n&&flag1==-1)flag1=3;//可能存在
        for(k=0;k<i;++k)ans.push_back(its[k]);
        if(flag1==-1){
            if(flag0==3){
                ans.push_back(ni);
                return ans;
            }
            else if(flag0>=0&&flag0<=2){
                its[i].end=ni.end;
            }
            else if(flag0==-1){
                its[i].end=ni.end;its[i].start=ni.start;
            }
			ans.push_back(its[i]);
            for(k=j;k<n;++k)ans.push_back(its[k]);
        }
        else if(flag1>=0&&flag1<=2){
            if(flag0==3){
                its[j].start=ni.start;
            }
            else if(flag0>=0&&flag0<=2){
                if(i!=j){
                    its[i].end=its[j].end;
                    ans.push_back(its[i]);
                    for(k=j+1;k<n;++k)ans.push_back(its[k]);
                    return ans;
                }
            }
            else if(flag0==-1){
                if(i==j){
                    its[j].start=ni.start;
                }
                else{
                    its[i].start=ni.start;
                    its[i].end=its[j].end;
                    ans.push_back(its[i]);
                    for(k=j+1;k<n;++k)ans.push_back(its[k]);
                    return ans;
                }
            }
            for(k=i;k<n;++k)ans.push_back(its[k]);
        }
        else if(flag1==3){//j==n
            if(flag0==3){
                ans.push_back(Interval(-1117,-1117));//不存在
            }
            else if(flag0>=0&&flag0<=2){
                its[i].end=ni.end;
				ans.push_back(its[i]);
				return ans;
            }
            else if(flag0==-1){
                its[i].start=ni.start;
                its[i].end=ni.end;
				ans.push_back(its[i]);return ans;
            }
            for(k=i;k<n;++k)ans.push_back(its[k]);
        }
        return ans;
    }
};

这题C++假设採用从原vector删除元素的方法,因为存在大量的移动。会导致超时。

法2:

class Solution {
public:
    vector<Interval> insert(vector<Interval> &its, Interval ni) {
        int i,n=its.size(),j,k;
        if(n==0){
            its.push_back(ni);
            return its;
        }
		vector<Interval>ans;//分成三段
		for(i=0;i<n&&its[i].end<ni.start;++i)ans.push_back(its[i]);
		if(i<n){
			ni.start=min(its[i].start,ni.start);
		}
		else{
			ans.push_back(ni);
			return ans;
		}
		for(;i<n&&ni.end>=its[i].start;++i){
			ni.end=max(its[i].end,ni.end);
		}
		ans.push_back(ni);
		for(;i<n;++i)ans.push_back(its[i]);
		return ans;
    }
};


posted @ 2017-07-20 17:14  lytwajue  阅读(123)  评论(0编辑  收藏  举报