class Solution {
  private:
    // 判断两个区域是否相交
    bool isIntersect(vector<int>& a, vector<int>& b) {
        if (a[0] < b[0] && a[1] < b[1] && a[1] > b[0]) {
            return true;
        }
        if (a[0] < b[0] && a[1] > b[1]) {
            return true;
        }
        return false;
    }
    // 合并两个区域
    vector<int> merge(vector<int>& a, vector<int>& b) {
        return {min(a[0], b[0]), max(a[1], b[1])};
    }
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param grasslands int整型vector<vector<>>
     * @return int整型vector<vector<>>
     */
    vector<vector<int>> mergeGrasslands(vector<vector<int>>& grasslands) {
        sort(grasslands.begin(), grasslands.end(), [&](const auto & a, const auto & b) {
            return a[0] < b[0];
        });
        vector<vector<int>> ans;
        int j;
        vector<int> temp;
        for (int i = 0; i < grasslands.size();) {
            j = i;
            temp = grasslands[j]; // 保存当前合并的区域
            // 找到所有与temp相交的区域,合并进temp中
            while (j < grasslands.size() - 1 &&
                    isIntersect(temp, grasslands[j + 1])) {
                temp = merge(temp, grasslands[j + 1]);
                j++;
            }
            ans.push_back(temp);
            i = j + 1;
        }
        return ans;
    }
};

时间复杂度:

1、对区域按左边界排序的时间复杂度为O(nlogn),其中n是区域的数量。

2、遍历排序后的草地区域需要O(n)的时间

3、在内部循环中,最坏情况下,每个区域都与前一个区域相交,需要O(n)的时间

因此,总体时间复杂度为O(nlogn)

空间复杂度:临时变量temp和结果向量ans的空间复杂度为O(n),总体空间复杂度为O(n)