https://leetcode-cn.com/problems/find-latest-group-of-size-m/
端点到区间的映射,有一个关键是,左右端点相同的时候,更改区间的一端的时候,不要删除原来的索引,因为还有另一个端点还在用。
struct Node{
int l;
int r;
int size(){
return r-l+1;
}
};
class Solution {
public:
int findLatestStep(vector<int>& arr, int m) {
unordered_map<int,Node*> record;
int ans=-1;
int cnt=0;
for(int i=0;i<arr.size();i++){
int pos=arr[i];
int lpos=pos-1;
int rpos=pos+1;
if(record.count(lpos)!=0 && record.count(rpos)==0){
Node* p=record[lpos];
assert(p->r==lpos);
if(p->size() == m){
cnt-=1;
}
if(p->size()!=1)
record.erase(lpos);
p->r=pos;
record[pos]=p;
if(p->size() ==m){
cnt+=1;
}
}
else if(record.count(lpos)==0 && record.count(rpos)!=0){
Node* p=record[rpos];
assert(p->l==rpos);
if(p->size() ==m){
cnt-=1;
}
if(p->size()!=1)
record.erase(rpos);
p->l=pos;
record[pos]=p;
if(p->size() ==m){
cnt+=1;
}
}
else if(record.count(lpos)!=0 && record.count(rpos)!=0){
Node *p1=record[lpos];
Node *p2=record[rpos];
assert(lpos==p1->r);
assert(rpos==p2->l);
Node *p3=new Node;
p3->l=p1->l;
p3->r=p2->r;
if(p1->size() == m){
cnt-=1;
}
if(p2->size() ==m){
cnt-=1;
}
if(p1->size()!=1)
record.erase(lpos);
if(p2->size()!=1)
record.erase(rpos);
record[p1->l]=p3;
record[p2->r]=p3;
delete p1;
delete p2;
if(p3->size() ==m){
cnt+=1;
}
}
else{
Node * p=new Node;
p->l=pos;
p->r=pos;
record[pos]=p;
if(p->size() ==m){
cnt+=1;
}
}
if(cnt>0){
ans=i+1;
}
}
return ans;
}
};