LeetCode 2276. 统计区间中的整数数目
2023-12-16 10:41:43
一、题目
1、题目描述
给你区间的?空?集,请你设计并实现满足要求的数据结构:
- 新增:添加一个区间到这个区间集合中。
- 统计:计算出现在?至少一个?区间中的整数个数。
实现?
CountIntervals
?类:
CountIntervals()
?使用区间的空集初始化对象void add(int left, int right)
?添加区间?[left, right]
?到区间集合之中。int count()
?返回出现在?至少一个?区间中的整数个数。注意:区间?
[left, right]
?表示满足?left <= x <= right
?的所有整数?x
2、接口描述
?
class CountIntervals {
public:
CountIntervals() {
}
void add(int left, int right) {
}
int count() {
}
};
/**
* Your CountIntervals object will be instantiated and called as such:
* CountIntervals* obj = new CountIntervals();
* obj->add(left,right);
* int param_2 = obj->count();
*/
3、原题链接
二、解题报告
1、思路分析
对于区间维护问题,我们可以用线段树轻松解决。由于数据量很大,我们用动态开点的话,会导致爆内存,所以这里采用动态开点线段树,即用即开。
关于线段树的知识见:高级搜索-线段树[C/C++]-CSDN博客
2、复杂度
时间复杂度:O(nlogn) 空间复杂度:O(nlogn)
3、代码详解
?
class CountIntervals {
public:
CountIntervals* left = nullptr , * right = nullptr;
int l , r , sum = 0;
CountIntervals():l(1),r(1e9) {
}
CountIntervals(int _l , int _r):l(_l) ,r(_r){
}
void add(int L, int R) {
if(sum == r - l + 1) return;
if(L <= l && r <= R)
{
sum = r - l + 1 ;return;
}
int mid = (l + r) >> 1;
if(left == nullptr) left = new CountIntervals(l,mid);
if(right == nullptr) right = new CountIntervals(mid+1,r);
if(L <= mid) left -> add(L , R);
if(R > mid) right -> add(L , R);
sum = left -> sum + right -> sum;
}
int count() {
return sum;
}
};
/**
* Your CountIntervals object will be instantiated and called as such:
* CountIntervals* obj = new CountIntervals();
* obj->add(left,right);
* int param_2 = obj->count();
*/
文章来源:https://blog.csdn.net/EQUINOX1/article/details/135028794
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!