week36

352 - 将数据流变为多个不相交区间

C++中的迭代器失效问题: 分为顺序类容器和关联类容器两种: 顺序类容器(如Vector等): 删除元素会导致后面的元素迭代器失效,但是erase会返回新的迭代器,迭代器支持随机访问 + x 操作 关联类容器(如Map Set等):删除元素不会导致后面的元素迭代器失效,但迭代器仅支持双向访问,不支持速记访问++, --

本题就是用Set来维护区间,找到第一个左端点比val大的元素 比较两边的端点和val来决定是新建区间还是合并区间

class SummaryRanges {
public:
    /** Initialize your data structure here. */
    using LL = long long;
    using PLL = pair<long, long>;

    set<PLL> S;
    static const LL INF = 1e18;
    SummaryRanges() {
        // 哨兵节点
        S.insert({-INF, -INF});
        S.insert({INF, INF});
    }
    
    void addNum(int val) {
        // 找到第一个左端点比val大的
        set<PLL>::iterator r = S.upper_bound({val, INF});
        set<PLL>::iterator l = r;
        l--;
        // 分情况
        if(l->second >= val) return;

        if(l->second == val - 1 && r->first == val + 1)
        {
            // 注意 关联式容器erase不会让迭代器失效,而顺序式容器删除会导致迭代器失效
            // 但erase方法会返回新的迭代器
            S.insert({l->first, r->second});
            S.erase(l);
            S.erase(r);
        }
        else if (l->second == val - 1)
        {
            S.insert({l->first, val});
            S.erase(l);
        }
        else if (r->first == val + 1)
        {
            S.insert({val, r->second});
            S.erase(r);
        }
        else 
        {
            S.insert({val, val});
        }
    }
    vector<vector<int>> getIntervals() {
        vector<vector<int>> res;
        for(auto p : S)
            if(p.first != -INF && p.first != INF)
                res.push_back({static_cast<int>(p.first), static_cast<int>(p.second)});
        return res;
    }
};

353 - 俄罗斯信封问题

一看就是先排序 然后最长上升子序列问题hiahia

说着就复习一下最长上升子序列问题的解法

这题除了排序一维然后 LIS即可

355 - 设计推特

这题有两个细节注意下:

    1. 自己也算自己的follwer

    1. 按时间戳多路归并,直接存vector就可以(默认按顺序排序),要保存timestamp,tweetId,userId,idx(归并排序的指针)

356 - 计算各个位数不相同的数字个数

总得来说是一个排列组合问题, 枚举每一位出现的可能性即可;

额外要注意的是不能有前导0(但是只有0可以)

所以举例,5位数:9 * 9 * 8 * 7 * 6 最后累加到一起即可

Last updated