leetcode 715. Range Module 解题报告
2017-12-19 19:08
351 查看
A Range Module is a module that tracks ranges of numbers. Your task is to design and implement the following interfaces in an efficient manner.
in the interval
Example 1:
Note:
A half open interval
The total number of calls to
The total number of calls to
The total number of calls to
A Range Module is a module that tracks ranges of numbers. Your task is to design and implement the following interfaces in an efficient manner.
主要用到了c++ map结构,map底层使用红黑树实现
class RangeModule {
public:
map<int,int> hm;
RangeModule() {
}
void addRange(int left, int right) {
if(left>right) return;
std::map<int,int>::iterator iter1,iter2;
iter1=hm.lower_bound(left);
iter2=hm.lower_bound(right);
if(iter1 == hm.end() && iter2==hm.end()){
hm[right]=left;
}else if(iter2!=hm.end() && hm[iter2->first]<=right ){
int m = min(left,iter2->second);
if(iter1 != hm.end() ) m = min(m,iter1->second);
hm[iter2->first] = m;
}else{
int m = left;
if(iter1 != hm.end()) m = min(m,iter1->second);
hm[right]= m;
}
iter1=hm.lower_bound(left);
iter2 = hm.lower_bound(right);
hm.erase(iter1,iter2);
}
bool queryRange(int left, int right) {
std::map<int,int>::iterator iter;
iter=hm.lower_bound(right);
if(iter==hm.end()){
return false;
}
if(iter->second<=left)
return true;
else
return false;
}
void removeRange(int left, int right) {
if(left>right) return;
std::map<int,int>::iterator iter1,iter2;
iter1=hm.lower_bound(left);
iter2=hm.lower_bound(right);
if(iter1!=hm.end() && iter1->second <left ){
hm[left]=iter1->second ;
}
if(iter2!=hm.end() && iter2->second<right){
hm[iter2->first]=right;
}
iter1=hm.upper_bound(left);
iter2=hm.upper_bound(right);
hm.erase(iter1,iter2);
}
};
/**
* Your RangeModule object will be instantiated and called as such:
* RangeModule obj = new RangeModule();
* obj.addRange(left,right);
* bool param_2 = obj.queryRange(left,right);
* obj.removeRange(left,right);
*/
addRange(int left, int right)Adds the half-open interval
[left, right), tracking every real number in that interval. Adding an interval that partially overlaps with currently tracked numbers should add any numbers in the interval
[left, right)that are not already tracked.
queryRange(int left, int right)Returns true if and only if every real number in the interval
[left, right)is currently being tracked.
removeRange(int left, int right)Stops tracking every real number currently being tracked
in the interval
[left, right).
Example 1:
addRange(10, 20): null removeRange(14, 16): null queryRange(10, 14): true (Every number in [10, 14) is being tracked) queryRange(13, 15): false (Numbers like 14, 14.03, 14.17 in [13, 15) are not being tracked) queryRange(16, 17): true (The number 16 in [16, 17) is still being tracked, despite the remove operation)
Note:
A half open interval
[left, right)denotes all real numbers
left <= x < right.
0 < left < right < 10^9in all calls to
addRange, queryRange, removeRange.
The total number of calls to
addRangein a single test case is at most
1000.
The total number of calls to
queryRangein a single test case is at most
5000.
The total number of calls to
removeRangein a single test case is at most
1000.
A Range Module is a module that tracks ranges of numbers. Your task is to design and implement the following interfaces in an efficient manner.
主要用到了c++ map结构,map底层使用红黑树实现
class RangeModule {
public:
map<int,int> hm;
RangeModule() {
}
void addRange(int left, int right) {
if(left>right) return;
std::map<int,int>::iterator iter1,iter2;
iter1=hm.lower_bound(left);
iter2=hm.lower_bound(right);
if(iter1 == hm.end() && iter2==hm.end()){
hm[right]=left;
}else if(iter2!=hm.end() && hm[iter2->first]<=right ){
int m = min(left,iter2->second);
if(iter1 != hm.end() ) m = min(m,iter1->second);
hm[iter2->first] = m;
}else{
int m = left;
if(iter1 != hm.end()) m = min(m,iter1->second);
hm[right]= m;
}
iter1=hm.lower_bound(left);
iter2 = hm.lower_bound(right);
hm.erase(iter1,iter2);
}
bool queryRange(int left, int right) {
std::map<int,int>::iterator iter;
iter=hm.lower_bound(right);
if(iter==hm.end()){
return false;
}
if(iter->second<=left)
return true;
else
return false;
}
void removeRange(int left, int right) {
if(left>right) return;
std::map<int,int>::iterator iter1,iter2;
iter1=hm.lower_bound(left);
iter2=hm.lower_bound(right);
if(iter1!=hm.end() && iter1->second <left ){
hm[left]=iter1->second ;
}
if(iter2!=hm.end() && iter2->second<right){
hm[iter2->first]=right;
}
iter1=hm.upper_bound(left);
iter2=hm.upper_bound(right);
hm.erase(iter1,iter2);
}
};
/**
* Your RangeModule object will be instantiated and called as such:
* RangeModule obj = new RangeModule();
* obj.addRange(left,right);
* bool param_2 = obj.queryRange(left,right);
* obj.removeRange(left,right);
*/
相关文章推荐
- [Leetcode] 514. Freedom Trail 解题报告
- 【LeetCode】Lowest Common Ancestor of a Binary Search Tree 解题报告
- Leetcode 397. Integer Replacement 整数替换 解题报告
- 【LeetCode】Find Largest Value in Each Tree Row 解题报告
- 【LeetCode】189. Rotate Array 解题报告
- LeetCode-Shortest Palindrome-解题报告
- 【LeetCode】Clone Graph 解题报告
- LeetCode-Largest Number-解题报告
- 【LeetCode解题报告】Add Digits
- [Leetcode] 36. Valid Sudoku 解题报告
- LeetCode 371.Sum of Two Integers 解题报告
- 【LeetCode】537. Complex Number Multiplication 解题报告
- LeetCode-Binary Search Tree Iterator-解题报告
- 【LeetCode】Number of Boomerangs 解题报告
- LeetCode 解题报告 Dungeon Game
- N-Queens [Leetcode解题报告]
- [leetcode] 124. Binary Tree Maximum Path Sum 解题报告
- [Leetcode] 422. Valid Word Square 解题报告
- Move Zeroes | leetcode 283 【Java解题报告】
- Leetcode 403. Frog Jump 青蛙过河 解题报告