假设我们要一个范围模块。这是一个跟踪数字范围的模块。我们的任务是以有效的方式设计和实现以下接口。
addRange(left,right)。这将是半开间隔(左,右),跟踪该间隔中的每个实数。现在,添加一个与当前跟踪的数字部分重叠的间隔,应该在间隔中添加尚未跟踪的任何数字。
queryRange(left,right)。当前正在跟踪间隔[left,right)中的每个实数时,它将返回true。
removeRange(left,right),这将停止跟踪间隔[left,right)中当前正在跟踪的每个实数。
为了解决这个问题,我们将遵循以下步骤-
定义一张映射
定义一个函数addRange()
,它将取左,右,
removeRange(左,右)
m [左]:=右
它:= m处左边的位置
如果它不等于m的第一个元素,并且它的前一个的第二个值与left相同,则-
(减少1)
第二个:=对
从m删除左
如果它不等于m的最后一个元素的前一个且它的下一个的第一个与右相同,则-
秒:=下一个秒
从m删除next(it)
定义一个函数queryRange()
,它将取左,右,
它:= m的子部分的位置的所有值均小于左值
如果m为空或与m的第一个元素相同,则-
返回假
(减少1)
当第二个> = right时返回true
定义一个函数removeRange()
,它将取左,右,
如果m为空,则-
返回
它:= m的子部分的位置都比左边高
如果它不等于m的第一个元素,则-
(减少1)
定义数组v
while(它不等于m的最后一个元素,并且它的第一个<右),执行-
在v的末尾插入第一行
如果第二个>对,则-
m [right]:=第二秒
temp:=秒
第二个:=左
如果temp> right,则:m [right]:= temp
如果第一个<左边,第二个>左边,则-
否则,当它首先> =左时,然后-
(增加1)
对于初始化i:= 0,当i <v的大小时,更新(将i增加1),执行-
从m删除v [i]
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class RangeModule { public: map <int, int> m; RangeModule() { } void addRange(int left, int right) { removeRange(left, right); m[left] = right; map <int, int> :: iterator it = m.find(left); if(it != m.begin() && prev(it)->second == left){ it--; it->second = right; m.erase(left); } if(it != prev(m.end()) && next(it)->first == right){ it->second = next(it)->second; m.erase(next(it)); } } bool queryRange(int left, int right) { map <int, int> :: iterator it = m.upper_bound(left); if(m.empty() || it == m.begin())return false; it--; return it->second >= right; } void removeRange(int left, int right) { if(m.empty())return; map <int, int> :: iterator it = m.lower_bound(left); if(it != m.begin())it--; vector <int> v; while(it != m.end() && it->first < right){ if(it->first < left && it->second > left){ int temp = it->second; it->second = left; if(temp > right){ m[right] = temp; } }else if(it->first >= left){ v.push_back(it->first); if(it->second > right){ m[right] = it->second; } } it++; } for(int i = 0; i < v.size(); i++){ m.erase(v[i]); } } }; main(){ RangeModule ob; ob.addRange(10,20); ob.removeRange(14,16); cout << (ob.queryRange(10,14)) << endl; cout << (ob.queryRange(13,15)) << endl; cout << (ob.queryRange(16,17)); }
Add range (10,20) Remove Range (14,16) Check ranges (10,14), (13,15), (16,17)
输出结果
1 0 1