leetcode-352:将数据流变为多个不相交区间

简介: leetcode-352:将数据流变为多个不相交区间

题目

题目链接

给你一个由非负整数 a1, a2, ..., an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表。

实现 SummaryRanges 类:

  • SummaryRanges() 使用一个空数据流初始化对象。
  • void addNum(int val) 向数据流中加入整数 val
  • int[][] getIntervals() 以不相交区间 [starti, endi] 的列表形式返回对数据流中整数的总结。

示例:

输入:
["SummaryRanges", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals", "addNum", "getIntervals"]
[[], [1], [], [3], [], [7], [], [2], [], [6], []]
输出:
[null, null, [[1, 1]], null, [[1, 1], [3, 3]], null, [[1, 1], [3, 3], [7, 7]], null, [[1, 3], [7, 7]], null, [[1, 3], [6, 7]]]
解释:
SummaryRanges summaryRanges = new SummaryRanges();
summaryRanges.addNum(1);      // arr = [1]
summaryRanges.getIntervals(); // 返回 [[1, 1]]
summaryRanges.addNum(3);      // arr = [1, 3]
summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3]]
summaryRanges.addNum(7);      // arr = [1, 3, 7]
summaryRanges.getIntervals(); // 返回 [[1, 1], [3, 3], [7, 7]]
summaryRanges.addNum(2);      // arr = [1, 2, 3, 7]
summaryRanges.getIntervals(); // 返回 [[1, 3], [7, 7]]
summaryRanges.addNum(6);      // arr = [1, 2, 3, 6, 7]
summaryRanges.getIntervals(); // 返回 [[1, 3], [6, 7]]

解题

方法一:模拟

参考链接

class SummaryRanges {
public:
    vector<vector<int>> res;
    unordered_set<int> set;
    SummaryRanges() {
    }
    int binary_search(int target, int pos){
        int left=0,right=res.size()-1, index;
        while(left<=right){
            int mid=(left+right)/2;
            if(res[mid][pos]==target){
                index=mid;
                break;
            }
            else if(res[mid][pos]>target){
                right=mid-1;
            }
            else{
                left=mid+1;
            }
        }
        return index;
    }
    void addNum(int val) {
        if(set.count(val)) return;
        set.insert(val);
        if(set.count(val+1)&&set.count(val-1)){//val-1和val+1都出现过,合并区间
            int left=binary_search(val-1,1);
            int right=binary_search(val+1,0);
            res[left][1]=res[right][1];
            res.erase(res.begin()+right);
        }
        else if(set.count(val+1)){//只有val+1出现过, 区间左边界变成val
            int index=binary_search(val+1,0);
            res[index][0]=val;
        }
        else if(set.count(val-1)){//只有val-1出现过,区间右边界变成val
            int index=binary_search(val-1,1);
            res[index][1]=val;
        }
        else{//val-1和val+1都没有出现过,val单独成区间
            res.push_back(vector<int>{val,val});
        }
        sort(res.begin(),res.end());//排序
    }
    vector<vector<int>> getIntervals() {
        return res;
    }
};


相关文章
|
9月前
|
索引
【力扣刷题】两数求和、移动零、相交链表、反转链表
【力扣刷题】两数求和、移动零、相交链表、反转链表
62 2
【力扣刷题】两数求和、移动零、相交链表、反转链表
|
4月前
|
算法
Leetcode第57题(插入区间)
LeetCode第57题“插入区间”的解题方法,包括题目描述、示例、算法思路和代码实现,旨在解决将新区间插入有序且不重叠的区间列表中,并合并重叠区间的问题。
34 0
Leetcode第57题(插入区间)
|
6月前
|
算法
LeetCode第57题插入区间
LeetCode第57题"插入区间"的解题方法,利用原区间集有序的特性,通过三步插入操作,有效实现了新区间的插入和重叠区间的合并。
LeetCode第57题插入区间
|
6月前
|
存储 Python
【Leetcode刷题Python】1496.判断路径是否相交
Leetcode第1496题"判断路径是否相交"的Python代码实现,通过使用字典存储方向和集合记录访问过的坐标点来检测路径是否与自身相交。
60 2
|
6月前
|
算法 Python
【Leetcode刷题Python】106.相交链表
采用双指针法来找出两个链表的相交起始节点,并详细解释了算法的时间和空间复杂度。
44 1
|
8月前
|
存储 算法 测试技术
力扣经典150题第四十七题:汇总区间
力扣经典150题第四十七题:汇总区间
60 1
|
8月前
|
存储 SQL 算法
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
|
8月前
|
存储 算法 搜索推荐
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
|
8月前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
|
8月前
|
存储 算法 数据可视化
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)
深入解析力扣160题:相交链表的解决方法(哈希表法与双指针法详细图解)