BM89 合并区间

关于区间问题,这里用到了差分染色的思想,通过标记两个端点标记一段连续的区间,而不是暴力遍历端点中的每个点进行标记。 
const int val = 200001 * 2 + 10086;
int inter[val];
class Solution {
public:
    vector<Interval> merge(vector<Interval> &intervals) {
        vector<Interval> res;
        for(auto & interval : intervals){
            upadteinter(interval.start * 2, interval.end * 2);
        }

        //生成结果
        int l = -1;
        int sum = 0;
        for(int i = 0;i < val;i++){
            sum+= inter[i];
            if(l == -1 && sum > 0){
                l = i;
            }
            if(l != -1 && sum == 0){
                res.emplace_back(l/2,(i-1)/2);
                l = -1;
                sum = 0;
            }
        }
        return res;
    }

    void upadteinter(int l, int r){
        inter[l]++;
        inter[r+1]--;
    }
};
posted @ 2023-02-19 18:10  重新出发123  阅读(64)  评论(0)    收藏  举报