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)

京公网安备 11010502036488号