![](http://static.javashuo.com/static/loading.gif)
變量簡潔正確完整思路 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是大於,沒有任何小於