Leetcode 352. 将数据流变为多个不相交区间 (利用set维护区间,同时使用两边使用哨兵进行二分查找)

 

typedef long long LL;
const LL INF = 1e18;
typedef pair<LL, LL> PLL;

class SummaryRanges {
private:
    set<PLL> intervals;
public:
    SummaryRanges() {
        intervals.insert({-INF, -INF});
        intervals.insert({INF, INF});
    }
    
    void addNum(int val) {
        // 找到 l1 最小的且满足 l1 > val 的区间 interval1 = [l1, r1]
        auto l1 = intervals.upper_bound({val, INF});
        auto l0 = l1;
        --l0;
        if (l0->second >= val) return;   // 点val在区间interval中
        else if (l0->second + 1 == val && l1->first - 1 == val) {
            intervals.insert({l0->first, l1->second});
            intervals.erase(l0);
            intervals.erase(l1);
        } else if (l0->second + 1 == val) {
            intervals.insert({l0->first, val});
            intervals.erase(l0);
        } else if (l1->first - 1 == val) {
            intervals.insert({val, l1->second});
            intervals.erase(l1);
        } else {
            intervals.insert({val, val});
        }


    }
    
    vector<vector<int>> getIntervals() {
        vector<vector<int>> res;
        for (auto& [l, r] : intervals) {
            if (l != -INF && r != INF) {
                res.push_back({(int)l, (int)r});
            }
        }
        return res;
    }
};

/**
 * Your SummaryRanges object will be instantiated and called as such:
 * SummaryRanges* obj = new SummaryRanges();
 * obj->addNum(val);
 * vector<vector<int>> param_2 = obj->getIntervals();
 */

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值