# 0715. Range Module
###### tags: `Leetcode` `Hard` `TreeMap`
Link: https://leetcode.com/problems/range-module/description/
## 思路
不能用差分法做 因为这样每一次```addRange```和```removeRange```都要重新扫一遍所有的key
思路参考[这里](https://leetcode.com/problems/range-module/solutions/947942/java-treemap-concise-code-adding-before-removing-simplify-the-code/)
我们把map的key当作interval的left, value当作interval的right
遇到```addRange()``` 我们把新的interval和已有的合并
遇到```removeRange()``` 我们先把要删掉的range加进map里面 然后再删掉
## Code
```java=
class RangeModule {
TreeMap<Integer, Integer> map;
public RangeModule() {
map = new TreeMap<>();
}
public void addRange(int left, int right) {
while(true){
Map.Entry<Integer, Integer> entry = map.floorEntry(right);
if(entry==null || entry.getValue()<left) break;
left = Math.min(left, entry.getKey());
right = Math.max(right, entry.getValue());
map.remove(entry.getKey());
}
map.put(left, right);
}
public boolean queryRange(int left, int right) {
Map.Entry<Integer, Integer> entry = map.floorEntry(left);
return entry!=null && entry.getValue()>=right;
}
public void removeRange(int left, int right) {
addRange(left, right);
Map.Entry<Integer, Integer> entry = map.floorEntry(left);
map.remove(entry.getKey());
if(entry.getKey()<left) map.put(entry.getKey(), left);
if(right<entry.getValue()) map.put(right, entry.getValue());
}
}
```