將數據流變爲多個不想交區間

 

 

變量簡潔正確完整思路
map<int左邊界,int右邊界>left2right
map<Int右邊界,int左邊界>right2left
能夠利用右邊界查找左邊界,能夠利用左邊界查找右邊界
對於num,查找num-1做爲右邊界的左邊界和num+1做爲左邊界的右邊界
若是都有,新的左邊界right2left[num-1]   新的右邊界left2rightleft2right[num+1]
刪掉原來的,
若是有左邊界
若是有右邊界
若是都沒有

輸出,由於map是排序的因此很是容易
class SummaryRanges {
public:
    map<int,int>left2right,right2left;
    /** Initialize your data structure here. */
    SummaryRanges() {

    }
    
    void addNum(int val) {
        auto iter=right2left.lower_bound(val);
        if(iter!=right2left.end()&&iter->second<=val)return;
        int hasLeft=right2left.count(val-1);
        int hasRight=left2right.count(val+1);
        if(hasLeft==1&&hasRight==1){
            int left=right2left[val-1];
            int right=left2right[val+1];
            //cout<<left<<' '<<right<<' '<<val<<endl;
            right2left.erase(val-1);
            left2right.erase(val+1);
            right2left[right]=left;
            left2right[left]=right;
            //cout<<right2left[val+1]<<' '<<val+1<<endl;
            //cout<<left<<' '<<left2right[val-1]<<endl;
        }
        else if(hasLeft==1&&hasRight==0){
            int left=right2left[val-1];
            //cout<<left<<' '<<val<<endl;
            right2left.erase(val-1);
            left2right.erase(left);
            right2left[val]=left;
            left2right[left]=val;
        }
        else if(hasLeft==0&&hasRight==1){
            int right=left2right[val+1];
            right2left.erase(right);
            left2right.erase(val+1);
            right2left[right]=val;
            left2right[val]=right;
        }else if(hasLeft==0&&hasRight==0){
            left2right[val]=val;
            right2left[val]=val;
        }
    }
    
    vector<vector<int>> getIntervals() {
        vector<vector<int>>ans;
        for(auto &mPair:left2right){
            ans.push_back({mPair.first,mPair.second});
        }
        return ans;
    }
};

/**
 * Your SummaryRanges object will be instantiated and called as such:
 * SummaryRanges* obj = new SummaryRanges();
 * obj->addNum(val);
 * vector<vector<int>> param_2 = obj->getIntervals();
 */
踩過的坑
            right2left[right]=left;
            left2right[left]=right;
            //right2left.insert({right,left});
            //left2right.insert({left,right});
不能用insert插入,由於這是映射關係,直接給一個數組會看作兩次插入,map不須要
使用insert

若是已經有了,就直接跳過,好比[8,6],來了6,用lower_bound找到第一個大於等於
6,second小於等於6就跳過

lower_bound是大於等於,upper_bound是大於,沒有任何小於
相關文章
相關標籤/搜索