zoukankan      html  css  js  c++  java
  • [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;
        }
    };


  • 相关阅读:
    Frame内容页向Frame页传值的问题。
    Silverlight 要求使用更新版本
    Siverlight 中RichTextBox 中注入控件无法使用的问题
    PHP_判断是否为数字
    CentOS中vsftp安装与配置
    全面认识F5负载均衡
    如何让php自动进行二级域名泛解析
    【Thinkphp教程】 如何实现URL伪静态
    LVS+heartbeat+ldirectord高可用负载均衡集群解决方案
    ThinkPHP小结
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7212299.html
Copyright © 2011-2022 走看看