当前位置:首页 > 力扣 > 力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

8个月前 (07-11)

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理 贪心算法 C++ 力扣题解 力扣LCR题 数组 第1张

一、题目解读

力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10],[15,18]],输出[[1,6],[8,10],[15,18]]。核心在于判断区间重叠逻辑与合并策略。

二、解题思路

采用贪心算法排序结合的思路:

1. 先排序:按区间起始点升序排列,确保后续遍历时能自然判断相邻区间的重叠关系。

2. 再合并:遍历排序后的区间,通过比较当前区间与末尾合并区间的终止点,决定是否合并或新增区间。

该思路关键在于利用排序减少遍历时的决策复杂度,符合贪心策略的“局部最优解推动全局最优”原则。

三、解题步骤

1. 空数组处理:若输入为空,直接返回空数组,避免后续逻辑错误。

2. 排序区间:使用C++的sort函数配合自定义比较函数(lambda表达式),按区间起始点排序。

3. 初始化合并数组:将第一个区间加入merged数组,作为合并基准。

4. 遍历合并:

○ 从第2个区间开始遍历,每次获取merged末尾区间(last)。

○ 若当前区间起始点≤ last[1](即重叠),则更新last[1]为二者终止点的最大值。

○ 若不重叠,直接添加当前区间至merged。

5. 返回结果:最终merged即为合并后的不重叠区间列表。

四、代码与注释

class Solution {
public:
    vector<vector<int>> merge(vector<vector<int>>& intervals) {
        if (intervals.empty()) return {};
    
    // 1. 按照区间起始点排序
    sort(intervals.begin(), intervals.end(), [](const vector<int>& a, const vector<int>& b) {
        return a[0] < b[0];
    });
    
    vector<vector<int>> merged;
    merged.push_back(intervals[0]);
    
    // 2. 遍历并合并重叠区间
    for (int i = 1; i < intervals.size(); ++i) {
        // 获取最后一个合并后的区间
        vector<int>& last = merged.back();
        
        // 如果当前区间与最后一个合并区间重叠
        if (intervals[i][0] <= last[1]) {
            // 合并区间,取最大的结束点
            last[1] = max(last[1], intervals[i][1]);
        } else {
            // 不重叠,直接添加新区间
            merged.push_back(intervals[i]);
        }
    }
    
    return merged;
    }
};

五、总结

该解法时间复杂度为O(nlogn)(排序)+ O(n)(遍历),空间复杂度为O(n)(合并数组)。优点是逻辑简洁、易于实现,缺点是对大规模数据排序可能耗时。实际应用中,若区间数量可控,此贪心排序策略能有效解决重叠合并问题。建议进一步优化可探索不排序的区间或扫描线算法,但复杂度可能上升。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣27题最优解:巧用左右指针,3分钟攻克原地操作

力扣27题最优解:巧用左右指针,3分钟攻克原地操作

题目要求从整数数组中原地移除所有等于给定值 val 的元素,并返回新的数组长度。最终数组的前 n 个位置应为非 val 的元素,且元素的顺序...

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

力扣451:ASCII数组计数法 用128个桶解决频率排序问题

题目重解给定一个字符串,将字符按照出现频率降序排列。例如输入"tree",可能返回"eetr"或"eert"。题目要求我们不考虑字母顺序,只...

征服力扣704题:三步掌握经典二分查找算法

征服力扣704题:三步掌握经典二分查找算法

题目重解我们面对的是算法领域最经典的二分查找问题:在一个已排序的整数数组中,快速定位目标值的位置。就像在一本按字母顺序排列的字典中查找单词,我们不需要逐页翻阅,而是通过不断折半的方式快速缩小搜索范围,...

力扣540题:线性扫描法如何高效定位唯一数

力扣540题:线性扫描法如何高效定位唯一数

题目重解一个严格递增的有序数组中,除某个元素外,其余每个元素均出现两次。这个看似简单的条件背后隐藏着巧妙的规律——单一元素会打破数组的"成对对称性"。题目要求以O(log n)时间...

洛谷P1007士兵过桥问题详解 C++贪心算法实现与优化

洛谷P1007士兵过桥问题详解 C++贪心算法实现与优化

题目解读这道题目描述了一座长度为L的桥上有n个士兵,每个士兵每秒可以向左或向右移动1个单位。当士兵到达桥的端点(0或L+1)时离开桥。要求计算所有士兵离开桥的最小时和最大时间。解题思路最小时计算:每个...

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

一、题目解读牛客13271题要求从给定的数字字符串中删除K个数字,使得剩余数字按原顺序排列后得到的最小数。题目核心在于如何在保持数字相对顺序的前提下,通过删除操作得到最优解。需注意结果字符串可能包含前...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。