zoukankan      html  css  js  c++  java
  • LeetCode 合并区间(贪心)

    题意

    给出一个区间的集合,请合并所有重叠的区间。

    示例

    输入: [[1,3],[2,6],[8,10],[15,18]]
    输出: [[1,6],[8,10],[15,18]]
    解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].

    思路

    贪心,按照每个区间的开始值,从小到大排序即可。

    从第一个区间开始往后扫描,如果可以合并,则合并;当不能合并的时候,将已经合并的区间计入到答案中,然后从此区间继续执行本操作。

    证明

    排序后,对于任意的i ,j (j > i)intervals[i][1] > intervals[j][0](即第i个和第j个区间无法合并) ,不存在一个z(z > j),使得intervals[i][1] <= intervals[z][0](即第z个区间可以和i合并)

    因为第j个区间不可以和第i个区间合并

    那么intervals[i][1] < intervals[j][0]

    由于排序是按照区间左端点进行排序

    那么intervals[j][0] < intervals[z][0]

    那么intervals[i][1] < intervals[z][0]

    即第z个区间不能与第i个区间合并

    代码

    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>> ans;
            sort(intervals.begin(), intervals.end(), cmp);
            int i = 0;
            while(i < intervals.size()){
                int j = i + 1;
                for(; j < intervals.size(); j++){
                    if(intervals[j][0] <= intervals[i][1]){
                        intervals[i][1] = max(intervals[j][1], intervals[i][1]);
                    }   
                    else{
                        break;
                    }
                }
                ans.emplace_back(intervals[i]);
                i = j;
            }
            return ans;
        }
    };
    
  • 相关阅读:
    【Java】:Java当中为什么不能够直接用==比较String字符串
    Mybatis
    spring boot
    IDEA
    IDEA
    kafka集群partition分布原理分析(转发)
    kafka集群partition分布原理分析(转发)
    scons ------ 基本使用
    色彩管理中的Gamma值的理解
    SFUD ------ (Serial Flash Universal Driver) 串行 Flash 通用驱动库
  • 原文地址:https://www.cnblogs.com/woxiaosade/p/12422451.html
Copyright © 2011-2022 走看看