leetcode 56 合并区间

简介: leetcode 56 合并区间

合并区间


c2b4702a749d47ebafac580da548549f.png按照左边界排序,排序之后局部最优:每次合并都取最大的右边界,这样就可以合并更多的区间了,整体最优:合并所有重叠的区间。

其实就是用合并区间后左边界和右边界,作为一个新的区间,加入到result数组里就可以了。如果没有合并就把原区间加入到result数组。

class Solution {
public:
    static bool compare(vector<int>&a , vector<int>&b)
    {
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if(intervals.size() <= 1) return intervals;
        vector<vector<int>> result;
        //按照区间左边界排序
        sort(intervals.begin() , intervals.end(),compare);
        //第一个区间作为临时区间
        vector<int> tmp = intervals[0];
        for(int i = 1 ; i< intervals.size() ; i++)
        {
          //如果当前区间和临时区间有重叠
          //取临时区间和当前区间的公共集合作为新的临时区间
            if(tmp[1] >= intervals[i][0])
            {
                tmp[0] = min(tmp[0] , intervals[i][0]);
                tmp[1] = max(tmp[1] , intervals[i][1]);
            }
            else//当临时区间和当前区间不重合
            {
                result.push_back(tmp);//临时区间存入
                tmp = intervals[i];//当前区间为新的临时区间
            }
            if(i==intervals.size()-1)//当前区间是最后一个区间的时候
            {
                 result.push_back(tmp);//存入未存入的临时区间
            }
        }
        return result;
    }
};

二刷

class Solution {
public:
    static bool cmp(vector<int> &a , vector<int> &b)
    {
        return a[0] < b[0];
    }
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        vector<vector<int>> result;
        sort(intervals.begin(),intervals.end(),cmp);
        for(int i=1 ; i<intervals.size() ;i++)
        {
            if(intervals[i][0] <= intervals[i-1][1])
            {
                intervals[i][0] = min(intervals[i][0],intervals[i-1][0]);
                intervals[i][1] = max(intervals[i][1],intervals[i-1][1]);
                intervals[i-1][0] = min(intervals[i][0],intervals[i-1][0]);
                intervals[i-1][1] = max(intervals[i][1],intervals[i-1][1]);
            }
            else
            {
                result.push_back(intervals[i-1]);
            }
        }
        result.push_back(intervals[intervals.size()-1]);
        return result;
    }
};
相关文章
|
6天前
|
存储 算法 数据可视化
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
【模拟面试问答】深入解析力扣163题:缺失的区间(线性扫描与双指针法详解)
|
6天前
|
存储 传感器 算法
LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用
LeetCode题目89:格雷码 递归、迭代及位操作在数组合并中的应用
|
6天前
|
存储 算法 数据挖掘
LeetCode 题目 88:双指针\直接\递归\插入排序\归并排序 实现合并两个有序数组
LeetCode 题目 88:双指针\直接\递归\插入排序\归并排序 实现合并两个有序数组
|
6天前
|
存储 SQL 算法
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
高效日程管理:利用区间合并算法优化活动安排【python LeetCode57】
|
6天前
|
存储 算法 搜索推荐
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
掌握区间合并:解决实际问题的算法策略和应用案例【python LeetCode题目56】
|
6天前
|
存储 算法 数据挖掘
Leetcode二十三题:合并K个升序链表【22/1000 python】
Leetcode二十三题:合并K个升序链表【22/1000 python】
|
6天前
|
SQL 算法 数据挖掘
LeetCode 二十一:合并两个有序链表 【python】
LeetCode 二十一:合并两个有序链表 【python】
|
10天前
|
算法 安全 Java
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 21:合并两个有序链表Java/C/Python3实现含注释说明,Easy)
13 1
|
22天前
DAY-4 | 力扣 - 求自身以外数组的乘积:区间划分,左右累乘,巧求乘积
该文档是关于LeetCode上的一道题目“Product of Array Except Self”的题解。提供了两种解题方法,一是暴力破解,即计算所有数的乘积后再逐个除以当前元素;二是左右累乘法,通过两次遍历数组分别计算左侧和右侧元素的乘积,避免了除法操作。其中,左右累乘法更优,代码实现中展示了这种方法。
24 1
|
24天前
|
存储 搜索推荐 C语言
Leetcode—合并两个有序数组—C语言
Leetcode—合并两个有序数组—C语言