美文网首页
LeetCode 区间链表问题

LeetCode 区间链表问题

作者: 来到了没有知识的荒原 | 来源:发表于2020-08-24 20:30 被阅读0次

1562. 查找大小为 M 的最新分组

class Solution {
public:
    vector<int>l,r;
    
    int get(int x){
        return r[x]-x+1;
    }
    
    int findLatestStep(vector<int>& arr, int m) {
        int n=arr.size();
        l=vector<int>(n+2),r=vector<int>(n+2);
        
        int cnt=0;
        int res=-1;
        for(int i=0;i<n;i++){
            int x=arr[i];
            
            if(l[x-1] && r[x+1]){
                if(get(l[x-1])==m)cnt--;
                if(get(x+1)==m)cnt--;
                
                r[l[x-1]]=r[x+1];
                l[r[x+1]]=l[x-1];
                
                if(get(l[x-1])==m)cnt++;
                
            }else if(l[x-1]){
                if(get(l[x-1])==m)cnt--;
                
                r[l[x-1]]=x;
                l[x]=l[x-1];
                
                if(get(l[x-1])==m)cnt++;
            }else if(r[x+1]){
                if(get(x+1)==m)cnt--;
                
                l[r[x+1]]=x;
                r[x]=r[x+1];
                if(get(x)==m)cnt++;
            }else{
                l[x]=r[x]=x;
                if(get(x)==m)cnt++;
            }
            if(cnt)res=i+1;
        }
                
        return res;
    }
};

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

class SummaryRanges {
public:
    /** Initialize your data structure here. */
    map<int, int> l, r;

    SummaryRanges() {

    }

    void addNum(int val) {
        if (r.size()) {
            auto it = r.upper_bound(val);
            if (it != r.begin()) {
                --it;
                if (it->second >= val) return;
            }
        }
        int right = r.count(val + 1), left = l.count(val - 1);
        if (left && right) {
            r[l[val - 1]] = r[val + 1];
            l[r[val + 1]] = l[val - 1];
            r.erase(val + 1), l.erase(val - 1);
        } else if (right) {
            l[r[val + 1]] = val;
            r[val] = r[val + 1];
            r.erase(val + 1);
        } else if (left) {
            r[l[val - 1]] = val;
            l[val] = l[val - 1];
            l.erase(val - 1);
        } else {
            r[val] = val;
            l[val] = val;
        }
    }

    vector<vector<int>> getIntervals() {
        vector<vector<int>> res;
        for (auto i:r) {
            int left = i.first, right = i.second;
            res.push_back({left, right});
        }
        return res;
    }
};

相关文章

网友评论

      本文标题:LeetCode 区间链表问题

      本文链接:https://www.haomeiwen.com/subject/njvnjktx.html