Overlap Interval

Question

(Median) 给一些interval和对应tag,interval可能有重合,要求输出每个小段的interval和对应的所有tag。

Solution

Method 1: priority_queue or map.

vector<vector<int>> overlapIntervalTag(vector<vector<int>> intervals) {
// output each vector vector<int>: [st, ed, tag1, tag2, ...] 
    sort(intervals.begin(), intervals.end());
    int n = intervals.size();
    multimap<int,int> mp; // end time, interval id
    unordered_set<int> st; // current ongoing overlapping interval id
    int pre = 0;
    vector<vector<int>> ret;
    for (int i=0; i<n;) {
        while(!mp.empty() && mp.begin()->first<=intervals[i][0]) {
            auto it = mp.begin();
            unorder_set<int> st_cpy  = st;
            while(!mp.empty() && it->first==mp.begin()->first) { // pop out the interval with same end time
                st.erase(mp.begin()->second);
                mp.erase(mp.begin());
            }
            ret.push_back({pre, it->first});
            for (int id: st_cpy) {
                ret.back().push_back(id);
            }
            pre = ret.back()[1];

        }

        int newSt = intervals[i][0];
        if (!st.empty()) {
            ret.push_back({pre, newSt});
            for(int id: st)
                ret.back().push_back(id);
        }
        while(i<n && intervals[i][0]==newSt) {
            mp.insert({intervals[i][1], i});
            st.insert(i);
            i++;
        }
        pre = newSt;

    }
    return ret;
}

Last updated